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

时间:2015-11-05 14:47:27

标签: c++ templates

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

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复制构造函数,它不允许复制对象。 / p>

如何修改调用函数,以便不调用基类构造函数? 有什么办法吗?

2 个答案:

答案 0 :(得分:1)

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

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


};

答案 1 :(得分:0)

你可以移动 B的实例而不是复制它,但是你无法按照你想要的方式完成它 - 你不能传递已经存在的{ {1}},您需要向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

请参阅std::move文档 - 关于移动和右值参考,有很多关于SO的主题。