这只是一个解释类层次结构的代码片段,而不是实际有问题的代码
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>
如何修改调用函数,以便不调用基类构造函数? 有什么办法吗?
答案 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的主题。