gpt4 book ai didi

c++ - "The expression should have a class pointer" Visual Studio C++ 错误

转载 作者:行者123 更新时间:2023-11-28 08:25:12 25 4
gpt4 key购买 nike

我有这两个文件,但是接口(interface)(和编译器)给我这个错误,你能帮我找出问题所在吗?真的很奇怪......我应该在 .cpp 中定义我的所有方法吗文件?

//GameMatch.h
#pragma once
#include "Player.h"

namespace Core
{
class GameMatch
{
private:
const static unsigned int MAX_PLAYERS=20;
unsigned int m_HumanControlled;
Score* m_LastDeclaredScore;
Score* m_LastScore;
unsigned int m_MaxPlayers;
Player* m_Players[MAX_PLAYERS];
unsigned int m_PlayerTurn;
inline void NextTurn() { m_PlayerTurn=(m_PlayerTurn+1U)%m_MaxPlayers; }
public:
GameMatch(void);
~GameMatch(void);
void RemovePlayer(Player* _player);
inline Player* getPlayingPlayer() { return m_Players[m_PlayerTurn]; }
};
}

//Player.h
#pragma once
#include "IController.h"
#include "GameMatch.h"
#include <string>
#include <Windows.h>

using namespace Core::Controller;
using namespace std;

namespace Core
{
class Player
{
private:
IController* m_Controller;
unsigned int m_Lives;
GameMatch* m_GameMatch;
string m_Name;
bool m_TurnDone;
public:
inline void Die()
{
m_Lives-=1U;
if (m_Lives<1) m_GameMatch->RemovePlayer(this);//m_GameMatch is the first error
}
inline const string& getName() { return m_Name; }
inline bool IsPlayerTurn() { return (m_GameMatch->getPlayingPlayer()==this); }//m_GameMatch is the second error
virtual void Play()=0;
inline Player(GameMatch* _gameMatch,const char* name,unsigned int lives=3)
{
m_GameMatch=_gameMatch;
m_Name=name;
m_Lives=lives;
}
inline void WaitTurn() { while(!IsPlayerTurn()) Sleep(1); }
virtual ~Player()
{
delete m_Controller;
}
};
}

但是正如你所看到的,m_GameMatch 一个指针,所以我不明白为什么会出现这个错误,可能是因为头文件的“递归包含”......

更新 1:

//GameMatch.h
#pragma once
#include "Score.h"
#include "Player.h"

namespace Core
{
class GameMatch
{
private:
const static unsigned int MAX_PLAYERS=20;
unsigned int m_HumanControlled;
Score* m_LastDeclaredScore;
Score* m_LastScore;
unsigned int m_MaxPlayers;
Player* m_Players[MAX_PLAYERS];
unsigned int m_PlayerTurn;
inline void NextTurn();
public:
GameMatch(void);
~GameMatch(void);
void RemovePlayer(Player* _player);
inline Player* getPlayingPlayer();
};
}

//Player.h
#pragma once
#include "IController.h"
#include "GameMatch.h"
#include <string>
#include <Windows.h>

using namespace Core::Controller;
using namespace std;

namespace Core
{
class Player
{
private:
IController* m_Controller;
unsigned int m_Lives;
GameMatch* m_GameMatch;
string m_Name;
bool m_TurnDone;
public:
inline void Die();
inline const string& getName();
inline bool IsPlayerTurn();
virtual void Play()=0;
inline Player(GameMatch* _gameMatch,const char* name,unsigned int lives=3);
inline void WaitTurn();
virtual ~Player();
};
}

这些是现在的 2 个 header ,但它仍然无法正常工作,如果我不包含 Player.h 并在 GameMatch.h 中以这种方式转发声明一个类:类播放器;它可以工作,但是如果我想使用一些 Player 方法怎么办?我应该重新转发声明所有内容……这不是头文件的作用吗?我可以在很多地方包含头文件...为什么我不能在这种情况下这样做?

解决方案:答案来自Alf P. Steinbach在聊天中:是的,你得到的答案似乎是正确的。循环 header 依赖性是一个问题。可能还有其他问题,但循环依赖是一个很大的问题。您不需要类的完整定义即可使用 T*。所以通常打破循环的方法就是向前声明一个类,比如

class Player;

告诉编译器 Player 是一个类,因此您可以使用 Player* 和 Player&,甚至声明返回 Player 的成员函数(尽管在完全定义 Player 类之前您不能定义这样的函数)举一个具体的例子,Core::GameMatch 类定义所需的只是 Player 类的前向声明。然后在实现文件中你可以包含“player.h”。如果 GameMatch 实现需要它。如果您将文件绘制为小方框并绘制箭头以显示包含,您会发现这消除了循环依赖

这就是说,他解释说我得到的答案是正确的,所以我会标记 OJ 的

最佳答案

您绝对应该避免循环 header 包含。

将函数的内容分解为 .cpp 文件,而不是将所有内容都放在头文件中。此外,与其每次都使用 #include 东西,不如直接转发声明。

如果您删除循环包含,您的代码很可能会工作。

关于c++ - "The expression should have a class pointer" Visual Studio C++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com