继承和映射c ++

时间:2012-12-03 11:10:51

标签: c++ multiple-inheritance

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

有人可以帮我这个吗?

5 个答案:

答案 0 :(得分:1)

这里有两个问题

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

    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(){} 现在它有效......

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

无论如何,谢谢!