声明extern类对象的问题

Joã*_*lva 2 c++ class undefined extern

首先我要说的是,我已经在google上广泛搜索了答案,更具体地说.

事实上我(至少我认为我做过)找到了类似问题的人,虽然给他们的答案给了我另一个问题.

我正在使用Visual Studio 2010 Express并使用SFML库(尽管我不认为这最后一部分是相关的)

所以这里:

我有一个名为player.cpp的源文件,它包含类Player,我有一个名为cc.h(命令和控制)的头文件(包含在所有源文件中),它包含所有必需的包含和外部变量/函数.基本代码可以总结如下:

Player.cpp:

#include "cc.h"
class Player
{
private:

//some variables here

public:

//more variables and some functions

}john;//example instance
Run Code Online (Sandbox Code Playgroud)

cc.h:

#pragma once

//some #includes
//some externs

extern Player john;
Run Code Online (Sandbox Code Playgroud)

现在在cc.h中,单词Player被强调为错误,表示它是一个未定义的标识符,但有时只是,有时,visual studio不会将其标记为错误,而是将其识别为类但不识别john作为同一个类的对象/实例(我希望它是这样称呼的).此外,在编译第一个错误时,它显示error C2146: syntax error : missing ';' before identifier 'john'在约翰的外部声明的行中,在cc.h中,显然(对我来说)没有任何意义.

Cod*_*r02 6

我认为cc.h中的全局声明对你没有帮助 - 因为你声明它从其他地方(除了Player.cpp之外)访问它,但为此你需要方法签名 - 你想要john从在其他地方,因此包括Player.cpp,你得到重复的符号.

请考虑创建一个Player.h只声明类和方法签名的文件 - 如下所示:

#ifndef PLAYER_H_
#define PLAYER_H_

class Player
{
     void doSomething();
};
#endif
Run Code Online (Sandbox Code Playgroud)

并将其添加到cc.h:

#include <Player.h>
extern Player john;
Run Code Online (Sandbox Code Playgroud)

并在你的Player.cpp

#include <Player.h>

Player john;

void Player::doSomething()
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

这可确保Player签名已知并且全局声明有效实例.