没有已知的从“Image *”到“const Image&”的参数1的转换

时间:2014-05-27 23:41:17

标签: c++ copy-constructor

我在调用我设置的复制构造函数时遇到了一些困难。

Image::Image(const Image& img) /* Copy constructor */
{
    this->x = img.x;
    this->y = img.y;
    this->data = img.data;
}

我试图用Image input = *new Image(GetInput());来调用它。 GetInput()会返回Image*。有没有办法让参数匹配?

3 个答案:

答案 0 :(得分:3)

这样做:

Image input = *new Image(GetInput());

导致即时内存泄漏,因为分配的内存无处存储。

如果GetInput()每次都没有分配返回的Image,您可以这样做:

Image input = *GetInput();

否则你最好选择一些智能指针:

std::unique_ptr<Image> input { GetInput() }; // C++11
auto input = std::make_unique<Image>(GetInput()); // C++1y / C++14

一个更好的解决方案是完全避免使用任何指针,但我想这超出了实际问题的范围......

此外,如果Image::data是一个动态分配的变量,如果您只是像在代码段中那样复制指针,那么您将遇到很多麻烦。

答案 1 :(得分:0)

*new Image(....)是一个坏主意,因为new分配的内存会立即泄露。你永远不会delete那个指针。

你可以写:

Image *p = GetInput();
Image input(*p);

您必须检查GetInput()函数以确定返回的指针是否需要删除;如果是这样,那么请跟进:

delete p;

注意:确保Image具有正确的复制构造函数(也请检查“三规则”)。

答案 2 :(得分:0)

如果我理解正确,您希望将GetInput的结果复制到新变量中。你可以用

做到这一点
Image input(*GetInput());

然而,GetInput返回的值会发生什么变化?该函数的文档应告诉您谁拥有该对象以及删除它的责任。

如果调用者(你是)拥有该对象,那么只需复制指针而不是创建新对象就可能更好:

Image *input = GetInput();