【问题标题】:Issue declaring extern class object声明外部类对象的问题
【发布时间】:2012-01-18 12:24:03
【问题描述】:

首先让我说我已经在谷歌上广泛搜索了答案,更具体地说是在这里。

问题是我实际上(至少我认为我做到了)找到了有类似问题的人,尽管给他们的答案给了我另一个问题。

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

就这样吧:

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

播放器.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 这个词被加下划线表示它是一个 undefined identifier ,但只是有时,有时 Visual Studio 不会将其标记为错误,而是识别它作为一个类,但不将 john 识别为同一类的对象/实例(我希望它被称为这种方式)。 此外,在编译第一个错误时,它显示的第一个错误是“error C2146: syntax error : missing ';' before identifier 'john'”,位于 cc.h 中 john 的 extern 声明行,这显然(对我而言)没有任何意义。

【问题讨论】:

    标签: c++ class undefined extern


    【解决方案1】:

    我猜 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 签名是已知的,并且在全局范围内声明了一个有效的实例。

    【讨论】:

    • 你不应该使用保留名称作为包含守卫(或其他任何东西),否则this 可能会发生。
    • 我添加了几个缺少的分号并更正了 Mike 指出的错误(保留以下划线和大写字母开头的标识符)
    • 添加#include extern Player john;在cc.cpp文件中也可以吧?
    【解决方案2】:

    在声明extern 变量之前,您需要将Player 类的定义放在头文件中。否则编译器不知道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
    

    【讨论】:

    • 添加#include extern Player john;在cc.cpp文件中也可以吧?
    【解决方案3】:
    1. 您需要在头文件中定义Player
    2. 使用extern 来使用具有外部链接且已在其他文件中定义的变量。

    例如:你有文件a.cpp,在这个文件里面有一个全局变量Player p。如果您想在文件c.cpp 中使用与Player 完全相同的实例p,则在文件c.cpp 中写入extern Player p

    我希望我说清楚了。

    【讨论】:

    • 这些类型的讨论放在cmets区域而不是作为独立答案BRO。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2012-12-15
      • 2010-12-10
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多