【问题标题】:Inherited member variable with specialized initialization具有专门初始化的继承成员变量
【发布时间】:2014-09-25 05:16:07
【问题描述】:

假设我们有一个封装向量的类,如下所示:

class VectorContainer
{
    public:
        VectorContainer()
            : mVector()
    protected:
        std::vector<int> mVector;
};

假设我们有一个继承结构,使上面给出的唯一合理的构造函数 - 不能再添加了。

假设我们需要一个专门的VectorContainer 子类,其中mVector 表示具有预定的恒定行/列数的网格。我们可以创建一个类似于
DerivedContainer(size_t numRows, size_t numColumns) 的构造函数,同时将 mVector 初始化为适当的大小吗?

【问题讨论】:

    标签: c++ inheritance c++11


    【解决方案1】:

    如果不更改VectorContainer 的构造函数,您将无法实现目标。这是因为这个基本构造函数将始终由DerivedContainer 的构造函数调用,因为这是唯一存在的 ctor。这也是明智的封装行为——mVectorVectorContainer 的成员,VectorContainers 有责任正确构造它。 DerivedContainers 构造函数总是可以根据需要调整它的大小。

    【讨论】:

    • 换句话说:具有所描述行为的最有效的“C++”方式是让VectorContainer构造mVector,然后在DerivedContainer构造函数中调用mVector.resize(...) ?
    【解决方案2】:

    您的成员变量mVector 是私有的,因此VectorContainer 之外的任何东西都无法访问它。由于不能扩展VectorContainer类,所以没用。


    对于受保护的,您可以在派生类中创建构造函数:

    class DerivedContainer : VectorContainer
    {
        public:
            DerivedContainer(size_t numRows, size_t numColumns) : VectorContainer()
            {
                mVector.assign( numRows );
            }
    };
    

    我不知道你为什么将两个变量传递给构造函数,但 std::vector 是一维数组。

    【讨论】:

    • 更多的是为了阅读的清晰性——当表示一个 3x3 网格时,即使我们知道它有 9 个元素,以看起来像 3x3 网格的方式构造一个实例也是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多