C++ C++;具有非默认构造函数的继承

C++ C++;具有非默认构造函数的继承,c++,inheritance,constructor,C++,Inheritance,Constructor,对于一个项目,我正在看一个存在以下情况的案例。有一个类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在构造时需要一个识别号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;
};
class foo {
public:
    foo(int x) :
    _private_var(x) {
    };
};
其中,foo是一个已经存在的类,看起来像:

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;
};
class foo {
public:
    foo(int x) :
    _private_var(x) {
    };
};
现在,我知道,由于foo没有带有零参数的默认构造函数,这将不起作用。出于以下几个原因,我不希望向foo添加一个没有任何参数的无意义构造函数。有什么好办法让它工作吗?现在我的编译器(Ubuntu下的gcc)给了我以下错误:

错误::对foo::foo()的调用没有匹配的函数

快速尝试通过替换bar的构造函数来解决此问题:

bar(int y, int z) : foo(y)
但这也不起作用


我还没有在网上找到有效的解决方案,非常感谢您的帮助。

这对我来说很好:

bar(int y, int z) : foo(y)
{
  _foo_ptr_1 = new foo(y);
  _foo_ptr_2 = new foo(z);
}
请不要试图直接调用类构造函数,就像它是静态方法,而不是C++中的类是如何构造的。至少,您可以使用
新类名(参数)
,如上所述

然而,这并不是真正的建议。。。使用
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;
};

如果你真的必须用硬的方式构造新的实例,你应该考虑使用智能指针,如<代码> UnQuyJPPT

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;
};
类栏:公共foo{
公众:
酒吧(整年,整年):foo(y),_foo_ptr_1(新foo(y)),_foo_ptr_2(新foo(z))
{
}
私人:
std::唯一的\u ptr\u foo\u ptr\u 1;
std::唯一的ptr_foo_ptr_2;
};

unique\u ptr
确保您的资源在其所有者被销毁时正确释放。如果您的
\u foo
成员变量不完全属于其父
bar
实例,则可以使用
共享的
。关于这些实用程序类的使用非常值得一读。

这里的问题是,您正试图解决继承问题

通过派生形式
foo
,您可以说
bar
foo
。一个foo有一个
\u private\u var
,所以你必须用一个有意义的值来填充这个var

如果希望以与
foo
相同的方式操作,但不共享其实现,则只希望与
foo
共享一个接口。这是在C++中使用的,它只使用纯虚函数和默认构造函数。例如,将其称为
foo\u接口
。然后,应通过
foo
(使用“真实”实现)和
bar
实现这两个
foo
的结果

您还应该以不同的方式实例化foo*:

   _foo_ptr_1 = foo::foo(y);
应该是

   _foo_ptr_1 = new foo(y); 

或者更好,如果可以的话,不要让foo成为指针。如这里所解释的:

<代码> {0} pTr.1= fo::Foo(y)不是你如何在C++中构造类的!你确定你有
foo*\u foo\u ptr\u 1在您的真实代码中?此错误消息在何处发出?错误在bar构造函数的行发出。由于
bar
本身是一个
foo
本身,您确定需要在内部另外两个
foo
s吗?也许一个额外的
foo
就足够了吗
bar
需要自己的ID吗?在这种情况下,它应该接受一个作为论点。如果它不需要ID,为什么它会继承自
foo
?+1对于所有建议不要使用指针的人,如果您可以避免它们;)这似乎是有效的,至少对于精简的情况,所以非常感谢。