我试图创建一个函数,根据收到的参数返回我拥有的3个全局对象中的一个,但是我收到以下错误: 类型' block&'的非const引用的无效初始化来自临时的类型'块'。
我对C ++和参考资料不太熟悉,但我尝试了不同的东西,似乎没有任何工作。这样做的正确方法是什么?
当然我想要的是实际选择的全局对象从getBlock传递给modifyBlock以便修改它;最后,该计划应该打印出#IT;工作!"。
#include <string>
#include <iostream>
using namespace std;
class block
{
public:
string blockId;
block (string id);
};
block::block(string id)
{
blockId=id;
}
block A = block("A");
block B = block("B");
block getBlock (string b)
{
if(A.blockId==b)
return A;
else return B;
}
block modifyBlock (block &x)
{
x.blockId="IT WORKS!";
}
int main ()
{
string b;
cout<<"Which block? ";
cin>>b;
modifyBlock(getBlock(b));
cout<<endl<<getBlock(b).blockId;
}
答案 0 :(得分:5)
此功能签名:
block getBlock (string b)
表示您按值返回block
个对象 。您将返回一个全局block
对象的副本。使用时如下:
modifyBlock(getBlock(b));
它失败了,因为函数的参数是临时的,并且不能绑定到非const左值引用。看起来您想在此处返回引用(block&
):
block& getBlock (string b)
{ // ^
return A.blockId == b ? A : B;
}
答案 1 :(得分:0)
只需修改功能
即可block getBlock (string b)
{
if(A.blockId==b)
return A;
else return B;
}
以下方式
block & getBlock( const string &b )
{
if(A.blockId==b)
return A;
else return B;
}
您要更改对象A或B,而不是他们的副本不是您吗?
对于错误,您将函数getBlock返回的临时对象传递给函数modifyBlock。临时对象只能用常量引用绑定。