我正在尝试在C ++中进行多重继承:
class Element{
public:
Element(): common_variable(0) {}
int common_variable;
};
class Number:public Element, public Setupable{
public:
Number() {}
vector<Digit> digit_vector;
};
class MultiLed:public Element, public Setupable{
public:
MultiLed() {}
vector<Led> led_vector;
};
对象元素永远不会实例化,但我使用它来避免在Multiled和Number中重复代码。
有一个地图包含一个数字:map<string,Number> mNumbers
,我希望它在第一次使用时创建:
mNumbers["blabla"].digit_vector.push_back(digit);
但这不起作用。正确完成对Element,Setupable和Number的构造函数的调用。但程序停止在“push_back”电话中说:
undefined symbol: _ZN14AcElementD2Ev
有人可以帮我这个吗?
答案 0 :(得分:1)
这里有两个问题
class
中,默认情况下所有成员都是私有的补丁代码:
class Element{
public:
Element(){
common_variable = 0;
}
int common_variable;
};
class Number:public Element, public Setupable{
public:
Number() {}
vector<Digit> digit_vector;
};
class MultiLed:public Element, public Setupable{
public:
MultiLed() {}
vector<Led> led_vector;
};
答案 1 :(得分:0)
digit_vector是私有的,您正试图在其类外访问。
答案 2 :(得分:0)
只是你忘了设置公共方法和变量
class Number:public Element, public Setupable
{
public:
Number(): Element(), Setupable() {}
vector<Digit> digit_vector;
};
顺便说一句,havin一个成员变量public并不总是好主意,
你应该提供一个返回digit_vector 的方法
//the method is provided in 2 soups, and there are reson for that
//even if you can omitt the "const" version, is better you keep both
const vector<Digit> & getDigits() const { return digit_vector; }
vector<Digit> & getDigits() { return digit_vector; }
或者如果您的类必须只是一个“数据容器”,请将其作为结构
struct Number:public Element, public Setupable
{
//default construsctors of Element and Setupable are still called!
//if not providing a default constructor, the compiler will create one
//automatically calling all default constructor (including the vector's
//one. Also digit_vector is constructed.
vector<Digit> digit_vector;
};
struct与class相同,唯一的区别是默认成员都是public, 所以你不必指定“public:”。一个好的风格是只使用类(并且你必须记住必须是公共的或私有的),并且只使用具有几乎没有bevhaiour / logic的数据容器的结构。
所以写道:
class Number:public Element, public Setupable
{
//default construsctors of Element and Setupable are still called!
//if not providing a default constructor, the compiler will create one
//automatically calling all default constructor (including the vector's
//one. Also digit_vector is constructed.
public:
vector<Digit> digit_vector;
};
也有效。但通常你不想隐式调用构造函数。
答案 3 :(得分:0)
由于您没有发布所有代码,我必须猜测代码中的情况。我会在您更新问题时更新我的答案。
最有可能的是,您在Element中声明了一个静态成员,名称可能是D2Ev
,但您忘记为其提供定义。
定义基类时,不要忘记声明虚析构函数。
class Element{
public:
Element():common_variable(0) {
}
virtual ~Element(){
}
int common_variable;
};
答案 4 :(得分:0)
我忘了实现析构函数~Element(){} 现在它有效......
对不起大家这个愚蠢的错误。
无论如何,谢谢!