对于一个项目,我正在查看存在以下情况的案例。有一个 foo 类,它在构造时需要一个标识号 x。所以它的构造函数参数看起来像 foo(x)。
现在我想派生一个基于 foo 的类,称为 bar,它基本上在内部包含两个 foo,而对于外部世界则充当一个 foo。我想要这样做的方法是为 bar 使用两个构造函数参数 y 和 z,然后在构造函数中生成 foo(y) 和 foo(z)。我希望一切都清楚。
我当前的实现类似于:
class bar : public foo {
public:
bar(int y, int z)
{
_foo_ptr_1 = foo::foo(y);
_foo_ptr_2 = foo::foo(z);
};
private:
foo *_foo_ptr_1;
foo *_foo_ptr_2;
};
其中 foo 是一个已经存在的类,看起来像这样:
class foo {
public:
foo(int x) :
_private_var(x) {
};
};
现在,我知道因为 foo 没有带零参数的默认构造函数,所以这将不起作用。出于多种原因,我不想向 foo 添加一个参数为零的无意义的构造函数。有什么好的方法可以使它正常工作吗?现在我的编译器(Ubuntu 下的 gcc)给我以下错误:
error::no matching function for call to foo::foo()
尝试解决此问题的快速尝试是替换 bar 的构造函数:
bar(int y, int z) : foo(y)
但这也行不通。
我还没能在网上找到一个可行的解决方案,如果有任何帮助,我将不胜感激。
最佳答案
这里的问题是您正试图解决继承问题。
通过派生 foo
形式,您是说 bar
是 foo
。 foo 有一个 _private_var
,所以你必须用一个有意义的值填充这个 var。
如果您想以与foo
相同的方式工作,但不共享其实现,您只想与foo
共享一个接口(interface)。这是在 C++ 中通过使用仅具有纯虚函数和默认构造函数的类来完成的。例如称它为 foo_interface
。然后,这应该由 foo
(具有“真实”实现)和 bar
实现,并通过实现组合两个 foo
' 的结果小号
您还应该以不同的方式实例化 foo*:
_foo_ptr_1 = foo::foo(y);
应该是
_foo_ptr_1 = new foo(y);
或者更好的是,如果可以的话,不要让 foo 成为一个指针。如此处所述:https://stackoverflow.com/a/23681932/137369
关于具有非默认构造函数的 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681804/