声明extern类对象的问题

时间:2012-01-18 12:24:03

标签: 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

cc.h:

#pragma once

//some #includes
//some externs

extern Player john;

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

4 个答案:

答案 0 :(得分:6)

cc.h中的全局声明对我没有帮助,我猜 - 因为你声明它从其他地方(除了Player.cpp之外)访问它,但为此你需要方法签名 - 你想要的很快要从其他地方访问john并因此包含Player.cpp,您将获得重复的符号。

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

#ifndef PLAYER_H_
#define PLAYER_H_

class Player
{
     void doSomething();
};
#endif

并将其添加到cc.h:

#include <Player.h>
extern Player john;

并在你的Player.cpp中

#include <Player.h>

Player john;

void Player::doSomething()
{
    //...
}

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

答案 1 :(得分:3)

在声明Player变量之前,您需要将extern类的定义放在头文件中。否则,编译器不知道Player是什么。

我建议这样的事情:

<强> player.h

#ifndef PLAYER_H_
#define PLAYER_H_

class Player {
    ...
};

#endif

<强> player.cpp

#include "player.h"

Player john;

<强> cc.h

#ifndef CC_H_
#define CC_H_

#include "player.h"

extern Player john;

#endif

答案 2 :(得分:0)

  1. 您需要在头文件
  2. 中定义Player
  3. 使用extern来使用具有外部链接的变量,并且已在其他文件中定义。
  4. 例如:您有文件a.cpp,并且此文件中包含全局变量Player p。如果您想在文件p中使用Player的完全相同的c.cpp实例,那么请在文件c.cpp内编写extern Player p

    我希望自己清楚明白。

答案 3 :(得分:0)

“ extern Player john;” 被认为是未定义的标识符,因为编译器无法理解 Player 是什么,因为您没有包含文件 Player.cpp ,其中将Player类声明为 cc.h 。 始终建议在头文件中声明该类及其方法,例如在Player.h中声明,然后在源文件(即Player.cpp)中定义这些方法。 并将player.h包含在您的cc.h中,以便编译器了解“ Player john;” 的声明位置。