我需要将对象的引用传递给构造函数。我在构造函数中传递了一个引用,但它出现此错误:成员“ Smash :: smash”不是类型名称。

Smash.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
};


我不明白该参数是引用,也是粉碎对象。
提前致谢。

最佳答案

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

但是还有其他一些问题使您的示例更难以工作:


首先,您的Smash类具有一个成员,该成员是对Smash的引用。这意味着您还必须定义用于初始化此引用的构造函数。
其次,您的成员game()声明未使用有效的参数类型(typo?)。假定game()与调用它的Smash对象一起使用,可以通过删除该参数来纠正此问题。
第三,但是,如果您需要Smash sgame()参数,则可以定义一个函数,该函数按值接受参数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。这具有误导性,因为此错误代码与覆盖有关,而覆盖与根本问题无关。

10-07 19:40