【问题标题】:C++ how to call a method defined in a class directly where only the reference to the class is returned by another functionC ++如何直接调用类中定义的方法,其中仅对类的引用由另一个函数返回
【发布时间】:2012-05-05 12:36:02
【问题描述】:

在我的程序中,我有一个网格类(例如myGrid),我可以通过重载operator() 来获得对单元格(一个类)的引用。我的问题是每次我调用这个myGrid(x, y) 它返回一个单元格的引用,我需要声明一个单元格引用。

 cell& myCell = myGrid(x,y);
 myCell.status = currentStatus; 

执行此操作时出现错误:

(myGrid(x,y)).status = currentStatus;

我需要非常频繁地使用单元格中定义的函数。因此,每次我需要声明一个单元格引用,这使得我的代码看起来很紧急。有什么优雅的方法来解决这个问题吗?非常感谢。干杯!

对不起。有一个错字。假设 status 是 cell 中的一个公共变量,并且假设 currentStatus 是一个与 status 类型相同的变量。

Grid 是一个预定义的类,我无权修改它。它返回对单元格的引用。 例如。单元格&运算符()(int x, int y)

抱歉造成混乱。 myGrid(x,y).status 有效。我之前在某个地方犯了一个错误。当我遵守它时,错误发生在这一行。非常感谢!

【问题讨论】:

  • 这是一个关于status() 方法的更多问题。它的签名是什么?
  • 错误是什么,status()的返回类型和签名是什么?
  • 错误,根据您提供的信息,您似乎应该让 status() 返回对 currentStatus 类型的引用。但你真的应该提供更多信息,坦率地说,它看起来不像一个好的设计。为什么不让它成为状态(currentStatus)?

标签: c++ class reference compiler-errors


【解决方案1】:

function-myGrid(x,y) 返回的对象,可能超出范围。 我的意思是,你返回的对象可能是一个局部变量。

【讨论】:

    【解决方案2】:

    您的operator() 是如何定义(签名)的? status 的签名是什么?它们应该是cell& operator() (int x, int y);int& status();。提供不起作用的最小示例。

    最好和优雅的方法是使用显式方法:

    myGrid.GetCell(x, y).SetStatus(s);
    

    这更具可读性和可支持性。此外,使用 getter/setter 而不是返回引用可以让您控制值更改的点 - 您可以在那里记录或设置断点。返回参考是不好的做法 - 您可能永远无法确定它是否会被更改或仅在之后阅读。

    【讨论】:

    • “返回参考是不好的做法”是有争议的,至少可以这么说!
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2015-11-05
    • 2023-03-21
    • 1970-01-01
    • 2013-11-14
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多