【问题标题】:Returning a global object from a function in C++从 C++ 中的函数返回全局对象
【发布时间】:2014-07-18 01:16:53
【问题描述】:

我正在尝试创建一个函数,该函数根据收到的参数返回我拥有的 3 个全局对象之一,但我收到以下错误: 从“block”类型的临时变量初始化“block&”类型的非常量引用无效。

我对 C++ 和引用不是很熟悉,但我尝试了不同的方法,但似乎没有任何效果。这样做的正确方法是什么?

当然,我想要的是实际选择的全局对象从 getBlock 传递到 modifyBlock 以便对其进行修改;最后程序应该打印“IT WORKS!”。

#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;
}

【问题讨论】:

    标签: c++ function object reference global


    【解决方案1】:

    这个函数签名:

    block getBlock (string b)
    

    表示您正在返回一个block 对象按值。您返回全局 block 对象之一的副本。像这样使用时:

    modifyBlock(getBlock(b));
    

    它失败了,因为函数的参数是临时的,并且不能绑定到非常量左值引用。您似乎想在此处返回参考 (block&amp;):

    block& getBlock (string b)
    { // ^
      return A.blockId == b ? A : B;
    }
    

    【讨论】:

      【解决方案2】:

      只需修改函数

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

      【讨论】:

        猜你喜欢
        • 2021-08-09
        • 2018-08-06
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 2014-04-12
        • 2020-08-18
        • 1970-01-01
        • 2016-05-09
        相关资源
        最近更新 更多