不应调用基类的复制构造函数
Copy Constructor of Base class should not be called
这只是一个解释类层次结构的代码片段,而不是实际的问题代码
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引用的主题。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用