Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“结构错误”;未初始化的引用成员“; 是一个NoB,特别是在C++中。_C++_Struct - Fatal编程技术网

“结构错误”;未初始化的引用成员“; 是一个NoB,特别是在C++中。

“结构错误”;未初始化的引用成员“; 是一个NoB,特别是在C++中。,c++,struct,C++,Struct,我在使用我想在某些函数中使用的结构时遇到一些问题 我在这里查看了关于头文件和.cpp中的结构的其他答案,但没有真正让它起作用 我的.h文件: namespace game { class CPlayer{ struct GameData{ int mBoard[8][8]; CBoard &pBoard; }; public: CMove Play(const CBoard &pBoard,const CDea

我在使用我想在某些函数中使用的结构时遇到一些问题

我在这里查看了关于头文件和.cpp中的结构的其他答案,但没有真正让它起作用

我的.h文件:

namespace game {

class CPlayer{

        struct GameData{
        int mBoard[8][8];
        CBoard &pBoard;
    };
public:

    CMove Play(const CBoard &pBoard,const CDeadline &pDue);

private:

    int GainsFromMoves(struct GameData gameData);
等等

然后在我的.cc文件中,我尝试将此数据用于:

CMove CPlayer::Play(const CBoard &pBoard,const CDeadline &pDue)
{

     GameData gameData;

     gameData.pBoard = pBoard;
等等

当我试图声明GameData时,我在“struct game::CPlayer::GameData”中得到一个错误
未初始化的引用成员

后来尝试使用GainsFromMoves函数时,我也遇到了一些错误

int GainsFromMoves(GameData gameData){

 int test = 0;

 return test;
}

error: Multiple markers at this line
    - expected ‘,’ or ‘;’ before ‘{’ token
    - ‘GameData’ was not declared in this 
     scope

我意识到我可能犯了一些真正的noob错误,但我很乐意得到一些指导。

好的,首先,您需要声明
CMove
CBoard
CDeadline
。我添加了一些虚拟问题,以解决其他问题:

namespace game {

struct CBoard {};
struct CDeadline {};
struct CMove {};
...
然后,您的结构
CPlayer::GameData
需要初始化它的
CBoard
引用,它应该是
const

class CPlayer{

        struct GameData
        {
          GameData(const CBoard& board) : pBoard(board) {}
          int mBoard[8][8];
          const CBoard &pBoard;
        };
public:
    CMove Play(const CBoard &pBoard,const CDeadline &pDue);
private:
    int GainsFromMoves(struct GameData gameData);
};
接下来,在
.cc
文件中,定义成员函数时需要名称空间和类名:

namespace game
{
CMove CPlayer::Play(const CBoard &pBoard,const CDeadline &pDue)
{
     GameData gameData(pBoard);
     return CMove();
}
int CPlayer::GainsFromMoves(GameData gameData){

  int test = 0;

 return test;
}

} // namespace game
这样可以消除错误,至少通过以下简单的main:

int main()
{
  game::CBoard b;
  game::CDeadline d;
  game::CPlayer p;
  p.Play(b, d);
}

必须在中初始化引用成员。通常,请尽量缩小问题范围。这与标题和cc无关。文件,您可以通过制作一个五行测试程序来重现问题。我认为很可能您的代码很混乱,并且您试图实现的目标实际上与您目前的目标相去甚远。但作为第一步,我将把
GameData
的声明移到
CPlayer
声明之外,即
struct GameData{…};类CPlayer{…}。你有什么理由在另一个里面声明一个吗?我也会完全放弃
命名空间游戏…
。在您的理解水平上,它只会使事情变得更复杂,而不会带来任何好处。第二个错误是因为编译器不知道类型,
GameData
。您需要在定义函数的源文件中包含定义
GameData
的头文件
。我认为@juanchopanza的建议很好。您需要重新开始,缓慢地构建代码,一次添加一小段,确保代码至少在运行过程中能够编译。在我看来,你尝试得太多太快了。这假设他的设计基本上是正确的,OP需要的只是关于实现它的技术方面的建议。我不确定这是否正确。但是如果这是OP需要的,这是一个非常有用的答案。@john你说得对,我根本不打算讨论这个设计。我认为这个问题还没有足够的信息。我发布的很多代码都是用来编译东西的虚拟代码。谢谢你的帮助,但我还是像你一样写的时候,它在我的play函数中起作用,但在我的GainsFromMoves中,我会出错。因此在标题中是:int GainsFromMoves(struct GameData GameData);在.cc文件中,它的:int GainsFromMoves(GameData GameData)但我得到了以下信息:此行有多个标记-“GameData”未在此范围内声明-应为“,”或“;”在“{”令牌类型“GameData”无法解析之前,DHMM很好地移动了结构以在.cc文件中声明它,再加上您的一些帮助,它使它至少可以编译,现在我将尝试看看它是否也可以工作。再次感谢