【问题标题】:C++ Member "Smash::smash" is not a type name.C++ 成员“Smash::smash”不是类型名称。
【发布时间】:2016-03-05 21:27:57
【问题描述】:

我需要将对象的引用传递给构造函数。我在构造函数中传递了一个引用,但它给出了这个错误:Member "Smash::smash" is not a type name.

粉碎.h:

#pragma once
#include "Smash.h"
#include "Window.h"
#include "Input.h"
#include "Game.h"
#include "Render.h"

class Smash {
public:
    Smash & smash;
    Game game(smash);
};

这里是例如Game类声明的构造函数:

#pragma once
#include "Smash.h"

class Game {
    public:
        Smash smash;
        Game(Smash & obj); //obj IS THE smash OBJECT
};

我不明白。该参数是一个参考,也是粉碎对象。 提前致谢。

【问题讨论】:

  • 你的testcase呢?
  • Game.h 包括Smash.hSmash.h 包括Game.h,你有一个循环依赖。其中一个需要更改为仅包含一个类声明,但如果不看你对这些类型做了什么,就很难说是哪一个。
  • @Praetorian:不是答案部分

标签: c++ object constructor reference


【解决方案1】:

您已正确使用 pragma once 以避免在相互依赖的标题中无休止地循环。然而,这还不够。您还应该在smash.h 中添加对Game 的前向引用

但还有一些其他问题使您的示例更难以运行:

  • 首先,您的Smash 类有一个成员,它是对Smash 的引用。这意味着您还必须定义初始化此引用的构造函数。

  • 其次,您对成员 game() 的声明未使用有效的参数类型(错字?)。这可以通过删除参数来纠正,假设 game() 与调用它的 Smash 对象一起使用。

  • 第三,如果您需要 Smash s 参数来表示 game(),您将定义一个函数,该函数按值接受参数 Smash。然后,您还需要一个复制构造函数。

把这一切包装在一起,你会得到smash.h

#pragma once
#include "Game.h"

class Game;             // Forward declaration for breaking the circular issue
class Smash {
public:
    Smash & smash;      // ==> needs to be initailized at construction
    Smash();            // <== therefore needs a constructor
    Game game(Smash s); // <== parameter needs a valid type
    Smash(const Smash &s);  // <== needs a copy constructor for param passing by value
};

另一个标题没问题。

MSVC2015 的有趣说明:如果缺少前向声明,由于奇怪的原因,编译器会在 game() 的定义上报告错误 3646。这是一种误导,因为此错误代码与覆盖有关,而与真正的问题完全无关。

【讨论】:

    【解决方案2】:

    你有一个循环依赖。 “Smash.h 包括 Game.h 包括 Smash.h 包括 Game.h”……

    这行不通。

    #pragma once 将使其实际上是“Smash.h 包含 Game.h”或“Game.h 包含 Smash.h”(取决于 .cpp 文件中首先包含的内容),但两个标题都可以确实需要在另一个中找到的声明。

    您将不得不使用前向声明来移除至少一个方向的依赖关系。

    【讨论】:

    • 而且Smash.h 也包括它自己:)
    • 这里的另一个问题是Game game(smash) 不是成员变量声明。
    • @Praetorian 你知道在哪里做这些前向声明吗?
    • @PythonLover17 不,不是没有testcase。 (Lightness 在他的第一条评论中已经要求你提供一个)
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2012-05-06
    相关资源
    最近更新 更多