Search code examples
c++classundefinedextern

Issue declaring extern class object


Let me start by saying I've extensively searched for answers on google and more specifically here.

The thing is I actually (at least I think I did) found people with similar problems, though the answer given to them gave me another problem.

I'm using Visual Studio 2010 Express and working with SFML libary (though i do not think this last part is relevant)

So here it goes:

I have a source file called player.cpp which holds class Player and I have a header file (included in all source files) called cc.h(command and control) that holds all the necessary includes and external variables/functions. The essential code can be summed up in the following:

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;

Now in cc.h the word Player is underlined as a mistake saying it is an undefined identifier , but only sometimes, other times visual studio doesn't mark it as a mistake, instead it recognizes it as a class but doesn't recognize john as an object/instance (i hope it's called this way) of that same class. Furthermore, at compiling the first error it shows is "error C2146: syntax error : missing ';' before identifier 'john'" at the line of the extern declaration of john, in cc.h, which apparently (to me) does not make any sense.


Solution

  • The global declaration in cc.h would not help you, I guess - because you declare it to access it from else where (other than Player.cpp), but for this you need the method signatures - a soon as you want to access john from elsewhere and thus include Player.cpp, you get duplicates symbols.

    Please consider creating a Player.h file where only the class and method signatures are declared - like this:

    #ifndef PLAYER_H_
    #define PLAYER_H_
    
    class Player
    {
         void doSomething();
    };
    #endif
    

    and add this to cc.h:

    #include <Player.h>
    extern Player john;
    

    and in your Player.cpp

    #include <Player.h>
    
    Player john;
    
    void Player::doSomething()
    {
        //...
    }
    

    This makes sure that the Player signatures are known and a valid instance is declared globally.