我想在Composed
类中包含一个Base
对象,并且不同的派生类具有不同的配置。但是Composed
类需要构造函数中的参数,而我无法控制其体系结构。
编译器报告错误,因为Composed
的参数应该在Base
类的初始化时传递。但我只希望它在派生类中初始化。在这种情况下我该怎么做?
class Base{
public:
Base(); //Error
protected:
Composed comp;
};
class Composed{
public:
Composed(int id):id(id);
private:
int id;
};
class Derived_1:public Base{
public:
Derived():comp(1234){};
};
class Derived_2:public Base{
public:
Derived():comp(2345){};
};
答案 0 :(得分:4)
您必须将该参数传递给Base,然后将其传递给comp:
SELECT link FROM `images` WHERE uid='85';
答案 1 :(得分:2)
想象一下,您构建了一个Base
对象。它如何知道要传递给comp
的构造函数的参数? Base
类基本上存在缺陷,这就是您遇到错误的原因。它需要知道如何构造它的Composed
成员对象。
您可以为Composed
添加默认构造函数,然后在Derived_1
和Derived_2
中修改此对象。或者,正如其他人所建议的那样,您可以使Base
的构造函数获取参数来构造comp
。这听起来比我好,但这取决于你的用例。
请记住,在构建Derived_1
或Derived_2
时,Base
类是在其他成员变量之前创建的第一个类。
答案 2 :(得分:1)
有几个选择。最简单的方法是将构建Comp所需的对象传递给Base类构造函数。
class Base{
public:
Base(int id):comp(id){}
protected:
Composed comp;
};
class Derived_1:public Base{
public:
Derived():Base(1234){}
};
class Derived_2:public Base{
public:
Derived():Base(2345){}
};
另一种可能性是不在基类中包含Comp。把它放在每个派生类中。您可以将纯虚函数添加到返回Comp(或其地址)的Base类。
另一个选择是存储指向Comp的指针(可能是unique_ptr)并在派生类中分配它。