从C ++中的函数返回全局对象

时间:2014-05-28 17:17:29

标签: c++ function object reference global

我试图创建一个函数,根据收到的参数返回我拥有的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;
}

2 个答案:

答案 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。临时对象只能用常量引用绑定。