-1

我正在尝试在 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;
};

对象 Element 从未实例化,但我使用它来避免 Multiled 和 Number 中的代码重复。

有一个包含 Number : 的地图,map<string,Number> mNumbers我希望在第一次使用时创建它:

mNumbers["blabla"].digit_vector.push_back(digit);

但这不起作用。对 Element、Setupable 和 Number 的构造函数的调用已正确完成。但是程序在“push_back”调用时停止,说:

undefined symbol: _ZN14AcElementD2Ev

有人可以帮我弄这个吗?

4

5 回答 5

1

你这里有两个问题

  1. 访问限制:class默认情况下所有成员都是私有的
  2. 您的构造函数未定义,仅声明

补丁代码:

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;
};
于 2012-12-03T11:33:40.607 回答
0

digit_vector 是私有的,您正试图在其类之外访问。

于 2012-12-03T11:25:54.240 回答
0

只是你忘记设置公共方法和变量

class Number:public Element, public Setupable 
{
 public:
    Number(): Element(), Setupable() {}
    vector<Digit> digit_vector;
};

顺便说一句,拥有一个成员变量 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:”。一个好的风格是只使用类(你必须记住必须是公共的还是私有的),并且只使用结构,你有一个几乎没有行为/逻辑的数据容器。

所以写:

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;
};

也是有效的。但通常你不希望隐式调用构造函数。

于 2012-12-03T11:36:33.260 回答
0

由于您没有发布所有代码,我不得不猜测您的代码中的情况。当您更新问题时,我会更新我的答案。很可能,您在 Element 中声明了一个静态成员,名称可能是D2Ev,但您忘记为其提供定义。

定义基类时,别忘了声明虚拟析构函数。

class Element{
public:
    Element():common_variable(0) {
    }
    virtual ~Element(){
    }
    int common_variable;
};
于 2012-12-03T12:02:54.590 回答
0

我忘了实现析构函数 ~Element(){} 现在它可以工作了......

对不起大家这个愚蠢的错误。

无论如何谢谢!

于 2012-12-04T10:06:11.823 回答