c++ - 在子类中初始化父类的 const 成员

标签 c++ oop initialization

我什至不确定这是否可能,所以我想澄清一下。我有一个带有 const 字符串数组的父类,我希望它由它的子类初始化,例如:

class CParent{
  CParent();
  const char** strings;
};

和子类

class CChild:CParent{
  CChild();
};

CChild::CChild()
: CParent::strings{
  "First",
  "Second"
}
{
  CParent();
  // some code
}

我需要它,因为我将调用 CParent 的构造函数,并且我需要在其中使用字符串。它可以通过参数传递来完成,但我想知道这样的事情是否可能。


编辑: 我在这里重写代码时忘记写一些东西,所以我宁愿复制粘贴它,这样我现在就不会忘记任何东西。在 Andy Prowl 的帮助下,我使用字符串和 vector 重写了它:

class CMenu {
public:
    CMenu(std::vector<std::string> const& s);
protected:
    std::vector<std::string> choicesStr;
};

CMenu::CMenu(std::vector<std::string> const & s) : choicesStr(s) {
    // code code
}

class CGameTypeMenu : public CMenu {
public:
    CGameTypeMenu();
};

CGameTypeMenu::CGameTypeMenu() 
 :CMenu(std::vector<std::string>("aaa","bbb")){ // This is where I 
                                                   get some nasty errors

}

错误看起来像这样:

In file included from /usr/include/c++/4.7/vector:63:0,
                 from CMenu.h:13,
                 from CGameTypeMenu.h:11,
                 from CGameTypeMenu.cpp:8:
/usr/include/c++/4.7/bits/stl_uninitialized.h:77:3:   required from ‘static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const char*; _ForwardIterator = std::basic_string<char>*; bool _TrivialValueTypes = false]’
(5+ more similar lines follow)

最佳答案

以正确的方式进行(此解决方案仅适用于 C++11):

#include <vector>
#include <string>

class CParent
{
    protected:
//  ^^^^^^^^^^ Make sure your constructor is at least protected,
//             or it will be inaccessible to derived classes

    CParent(std::vector<std::string> const& s) : strings(s) { };

    std::vector<std::string> strings;
//  ^^^^^^^^^^^^^^^^^^^^^^^^ Use containers and classes from the C++ Standard
//                           Library rather than raw pointers
};

class CChild : public CParent
//           ^^^^^^^^^^^^^^^^ I suppose you forgot this.
//                            Inheritance is private by
//                            default, which does not seem
//                            to be what you want   
{
    CChild();
};

CChild::CChild()
    :
    CParent({"First", "Second"}) // C++11 ONLY!
//          ^^^^^^^^^^^^^^^^^^^
//          Implicit construction of the vector of string
{
    // some code
}

关于c++ - 在子类中初始化父类的 const 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15271501/

相关文章:

c++ - 100选10,附加条件

java - Kotlin 中的一切都是对象吗?

c++ - 变量自身初始化

C - 以某种密度填充矩阵

arrays - 是否可以在不重复长度的情况下声明指定类型的静态数组?

c++ - dynamic_cast 到派生类返回 nullptr

c++ - 引用的生命周期是否延长?

c++ - 访问外部窗口句柄

java - 静态对象存储在java中的位置

c++ - 一个基类只有一个派生类可以吗?