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.
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.