gpt4 book ai didi

c++ - 如何从函数调用创建对象变量?

转载 作者:行者123 更新时间:2023-11-28 00:36:39 25 4
gpt4 key购买 nike

我们正在使用我们的教授编写的自定义图像类。我可以像这样加载图像

SimpleGrayImage in("images/uni01.pgm");

现在我有一个看起来像这样的函数

SimpleGrayImage apply_mask(SimpleGrayImage &img,SimpleFloatImage &mask){

我也可以像这样使用方法 apply_mask(...).show();

但我不允许这样做 SimpleGrayImage img = apply_mask(...);

我是不是漏掉了什么,或者是我们的教授忘记添加另一个构造函数了吗?

test.cpp:133:43: error: no matching function for call to ‘SimpleGrayImage::SimpleGrayImage(SimpleGrayImage)’
SimpleGrayImage img = apply_mask(in,mask);
^
test:133:43: note: candidates are:
In file included from SimpleFloatImage.h:13:0,
from aufgabe11_12_13.cpp:13:
SimpleGrayImage.h:110:2: note: SimpleGrayImage::SimpleGrayImage(const string&)
SimpleGrayImage(const std::string& filename);
^
SimpleGrayImage.h:110:2: note: no known conversion for argument 1 from ‘SimpleGrayImage’ to ‘const string& {aka const std::basic_string<char>&}’
SimpleGrayImage.h:91:2: note: SimpleGrayImage::SimpleGrayImage(SimpleGrayImage&)
SimpleGrayImage(SimpleGrayImage &img);
^
SimpleGrayImage.h:91:2: note: no known conversion for argument 1 from ‘SimpleGrayImage’ to ‘SimpleGrayImage&’
SimpleGrayImage.h:86:2: note: SimpleGrayImage::SimpleGrayImage(int, int)
SimpleGrayImage(int wid, int hig);
^
SimpleGrayImage.h:86:2: note: candidate expects 2 arguments, 1 provided
SimpleGrayImage.h:80:2: note: SimpleGrayImage::SimpleGrayImage()
SimpleGrayImage();
^
SimpleGrayImage.h:80:2: note: candidate expects 0 arguments, 1 provided

最佳答案

从错误中我可以看出复制构造函数没有正确定义:

SimpleGrayImage::SimpleGrayImage(SimpleGrayImage&)

这不会被调用,因为您从函数 apply_mask 返回的值不是局部变量而是右值。

为了使构造函数接受右值,您需要将复制构造函数的签名更改为

SimpleGrayImage::SimpleGrayImage(const SimpleGrayImage&)//note the new const

编辑:有关右值的更多信息,您可以查看 this link .右值可以转换为 const SimpleGrayImag& a = apply_mask() 因为 const 确保您不能对 a 进行更改,因此编译器可以安全地给你那个本地内存的地址。没有 const 的定义只能用于这样的左值:

SimpleGrayImag a;//this is an lvalue;
SimpleGrayImag b = a;

最好的方法是对所有您不希望它们成为输出参数的参数使用 const。您也可以使用 const 和非 const 两个版本创建函数,大多数情况下编译器会理解您的意思,但是应该避免这样做,因为代码更难阅读和理解。

关于c++ - 如何从函数调用创建对象变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20618160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com