带有非默认构造函数的c++继承
C++ inheritance with non-default constructors
对于一个项目,我正在查看存在以下情况的情况。有一个类foo在构造时需要一个标识号x。所以它的构造函数参数看起来像foo(x)。
现在我想派生一个基于foo的类,叫做bar,它基本上在内部保存两个foo,在外部世界作为一个单独的foo。我想要做到这一点的方式是使用两个构造函数参数y和z为bar,然后,在构造函数中,生成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)给了我以下错误:
可以通过替换bar: 的构造函数来快速解决这个问题。错误::没有匹配函数调用foo::foo()
bar(int y, int z) : foo(y)
但这也不起作用。
我还没能在网上找到一个有效的解决方案,如果有任何帮助,我将不胜感激。
这里的问题是您试图绕过继承。
通过推导形式foo
,您说bar
是foo
。foo有一个_private_var
,所以你必须用一个有意义的值来填充这个变量。
如果您想以与foo
相同的方式操作,但不共享其实现,则只希望与foo
共享一个接口。这在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
这对我来说很好:
bar(int y, int z) : foo(y)
{
_foo_ptr_1 = new foo(y);
_foo_ptr_2 = new foo(z);
}
请不要试图直接调用类构造函数,就像它是静态方法一样,这不是c++中构造类的方式。至少,您可以使用new classname(arguments)
,如上所述。
不建议这样做…使用new
和delete
进行显式内存管理很容易出错。
首先,考虑您可能根本不需要分配任何foo
实例。您可以只使用简单的成员变量:
class bar : public foo {
public:
bar(int y, int z) : foo(y), _foo_1(y), _foo_2(z)
{
}
private:
foo _foo_1;
foo _foo_2;
};
如果真的必须以困难的方式构造新的实例,你应该考虑使用智能指针,如unique_ptr
。
class bar : public foo {
public:
bar(int y, int z) : foo(y), _foo_ptr_1(new foo(y)), _foo_ptr_2(new foo(z))
{
}
private:
std::unique_ptr<foo> _foo_ptr_1;
std::unique_ptr<foo> _foo_ptr_2;
};
unique_ptr
确保当资源的所有者被销毁时,资源被正确地释放。如果您的_foo
成员变量不专属于它们的父bar
实例,那么您可以使用shared_ptr
代替。关于这些实用程序类的使用,非常值得阅读。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象