C++ 如何:复制没有适当默认构造函数的类实例;有没有没有默认构造函数的成员?

C++ 如何:复制没有适当默认构造函数的类实例;有没有没有默认构造函数的成员?,c++,C++,阅读本文,了解将类实例复制到向量中的问题 所以问题是我们在循环中生成实例: // B doesn't have a default constructor. class A { public: A(Important resource) : b(resource) {} B b; }; std::vector some_vector(0); 对于(int i=0;i

阅读本文,了解将类实例复制到向量中的问题

所以问题是我们在循环中生成实例:

// B doesn't have a default constructor.
class A {
  public:
  A(Important resource) : b(resource) {}
  B b;
};
std::vector some_vector(0);
对于(int i=0;i<7;i++)
一些向量。推回(A(参考资料[i]);
从Valgrind的情况来看,它闻起来像是复制构造函数把事情搞砸了。 当我们将代码更改为:

std::vector<A> some_vector(0);
for (int i = 0; i < 7; i++)
  some_vector.push_back(A(resources[i]));
std::vector some_vector(0);
对于(int i=0;i<7;i++)
一些向量。推回(新的A(参考资料[i]);

问题得到缓解。但我不喜欢在不需要的时候这样做。所以我想,复制构造函数在试图复制一个没有正确默认构造函数的C++类时,应该如何做?对于被推到STD的类型T的元素,

< p>::C++中的向量,

这意味着它必须有一个工作的move或copy构造函数,在创建新对象时将使用该构造函数。它通常不需要默认构造函数,但某些操作可能需要它,例如调整大小

作为示例中的资源,它可能不可复制,但可能是可移动的。如果B没有正确的复制构造函数,您将得到资源的副本,析构函数将多次释放资源(例如,释放内存或关闭文件)

对于资源,常用的模式是使用std::unique_指针作为内存


PS:自C++11以来,出现了一种新类型的构造函数/赋值运算符。三的规则现在变成了五的规则,但是在不处理资源处理类时,最好不要编写复制或赋值构造函数。只有这些类需要实现这些操作,其他类可以直接使用它。这是,也是我建议坚持的。同样,
std::unique_指针
就是一个很好的例子。您的类不需要编写移动/复制构造函数,只需使用
唯一的\u ptr
共享的\u ptr
,内存管理就可以了。

“复制构造函数在没有正确的默认构造函数的情况下试图复制类时如何知道该做什么?”这两件事是不相关的。复制不需要默认构造。默认构造函数在正确复制中不起作用。您需要一个工作副本构造函数,要编写一个,您希望您的成员和基具有工作副本构造函数。它“闻起来像”
B
有一个损坏的副本构造函数。您应该检查
B
以检查它在复制/移动时是否正常工作。使用B指针而不是实际的B,是否可以解决此问题?@zehelvion不,修复您的错误可以解决此问题。使用指针会隐藏您的bug并更改代码的语义。非常感谢。这就是这个项目通常要做的。
std::vector<A*> some_vector(0);
for (int i = 0; i < 7; i++)
  some_vector.push_back(new A(resources[i]));