不应调用基类的复制构造函数

Copy Constructor of Base class should not be called

本文关键字:复制 构造函数 基类 调用      更新时间:2023-10-16

这只是一个解释类层次结构的代码片段,而不是实际的问题代码

class A
{};
class B : public class C
{};
class C : public NocopyClass // constructors are private in Nocopy class
{};
template<typename T1, typename T2>
class D
public:
  T1 _t1;
  T2 _t2;
  D(T1& t1, T2& t2) : _t1(t1),_t2(t2) {}
{
};
class E: public class D<A,B>
{
    E(const& a,const& b) : D<A,B>(a,b) {}
};

调用功能:

A objA;
B objB;
E objE(objA,objB);

从调用程序中,我想将A的对象和B的对象传递给类E在这里,E中定义的复制构造函数被调用,A和B的对象被复制,这反过来又调用了类B的复制构造函数,直到超级基类NocopyClass复制构造函数,它不允许复制对象。

如何修改调用函数,使基类构造函数不被调用?有办法吗?

尝试将_t1和_t2声明为引用。

template<typename T1, typename T2>
{
class D
public:
  T1 &_t1;
  T2 &_t2;
  D(T1& t1, T2& t2) : _t1(t1),_t2(t2) {}

};

您可以移动B的实例,而不是复制它,但您无法完全按照您想要的方式进行操作-您无法传递已经存在的B实例,您需要向E发送一个新实例(请参阅下面的main代码):

#include <utility>  
template<typename T1, typename T2>
class D
public:
  T1 _t1;
  T2 _t2;
  D(T1 &t1, T2 &&t2) : _t1 (t1) {
      _t2 = std::move (t2) ;
  }
};
class E: public class D<A,B>
{
    E(const& a, &&b) : D<A,B>(a, std::move(b)) {}
};

当创建E的新实例时,您需要这样做:

A a; // no problem with a
E (a, B()) ; // You need to have a rvalue for b

请参阅std::move文档-SO上有很多关于move和rvalue引用的主题。