【问题标题】:C++ lvalue required as unary '&' operand需要 C++ 左值作为一元“&”操作数
【发布时间】:2011-07-29 22:40:54
【问题描述】:

我正在开发游戏引擎并致力于实现状态设计。我有一个 Engine 类,它负责一切的所有初始化,并包含调用活动状态的更新、渲染和处理输入函数的游戏循环。

我所有不同的状态都继承自 State,它需要在其构造函数中引用 Engine 类,以便初始化引擎的受保护引用以供将来使用。以下是相关代码:

// file: state.h
class Engine;

class State {
public:

    State(Engine &engine) : mEngine(engine) { }
protected:
    Engine &mEngine;
};

// file: gamestate.h
class GameState : public State {
public:
    GameState(Engine &engine) : State(engine) {}
};

最后在初始化器的engine.cpp中,我创建了一个新的GameState对象,这是报告错误的地方。

GameState *state = new GameState(&this);

我现在正在使用 Linux 上的 Qt Creator 在 C++ 中对其进行编码,目前无法访问 Windows 机器来查看 gcc 是否存在问题。

【问题讨论】:

  • 为什么不用外部全局指针而不是成员指针?
  • @Shaktal 不,不可能选择引擎。注射是个好东西。而全局变量肯定是一件坏事。事实上state 甚至不应该是引擎的成员。此外,C++ 是一种现代语言。不要再在不需要的地方搞乱指针了!为什么不简单地Engine engine; GameState state(engine)

标签: c++


【解决方案1】:

变化:

 GameState *state = new GameState(&this);

到:

GameState *state = new GameState(*this);

这是因为您通过引用 State 类的构造函数来传递 Engine。

【讨论】:

  • @Jesus 但this 是指针而不是引用 - 他需要取消引用才能将其作为引用传递。
  • 哦,你是对的,我已经有一段时间没有做一些 C++ 了,我把它与 C#/Java 风格混淆了
  • 干杯!这解决了它:) 关于引用而不是指针 - 真的没有充分的理由,所以我只会责怪热浪这样做。对 C++ 来说还是相当新的,所以有什么明显的区别吗?
  • @grouse:我建议你继续这样做。传递引用(而不是指针)清楚地表明接收端不负责管理传递的对象,并且明确表示它也不能为空。尽可能选择对指针的引用。然后更喜欢智能指针而不是指针,只有在别无选择(或有充分理由这样做)时才使用原始指针
  • @David - 谢谢,这是有道理的,我将从我的解决方案中删除它,希望人们会注意到你的评论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2018-02-04
相关资源
最近更新 更多