我需要将对象的引用传递给构造函数。我在构造函数中传递了一个引用,但它出现此错误:成员“ 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 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。这具有误导性,因为此错误代码与覆盖有关,而覆盖与根本问题无关。