2012-01-18 15 views
1

私は、Googleで、より具体的には、ここでは広範に回答を検索したと言って始めましょう。externクラスオブジェクトを宣言する問題

私が実際に(少なくとも私がやったと思うのは)同様の問題を抱えた人々が見つかりましたが、彼らに与えられた答えは私に別の問題をもたらしました。

私は、Visual Studio 2010のExpressを使用して(私はこの最後の部分が関連しているとは思わないが)だからここにそれが行くSFMLのlibaryで

を働いている:

私はプレーヤーと呼ばれるソースファイルを持っています。 cppはclass 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:プレーヤーは間違いとして下線が引かれているcc.h言葉で今

#pragma once 

//some #includes 
//some externs 

extern Player john; 

不可欠なコードは次のように要約することができます未定義の識別子だと言っていますが、ときどき、視覚スタジオはそれを間違いとしてマークせず、代わりにクラスとして認識しますが、オブジェクト/インスタンスとしてジョンを認識しません(私はこれを同じクラスの方法です)。 さらに、最初のエラーをコンパイルするときには、johnのextern宣言の行に "error C2146: syntax error : missing ';' before identifier 'john'"と表示されています。これはcc.hで、明らかに(私にとっては)意味がありません。

答えて

5

cc.hのグローバル宣言はあなたには役に立たないと思います。他の場所からPlayer.cppにアクセスするように宣言していますが、このためにメソッドシグネチャが必要です他の場所からjohnにアクセスして、Player.cppを含める場合は、重複するシンボルが表示されます。

#ifndef PLAYER_H_ 
#define PLAYER_H_ 

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

をしてcc.hにこれを追加します:

#include <Player.h> 
extern Player john; 

をし、プレイヤーでこのように -

唯一のクラスとメソッドのシグネチャが宣言されているPlayer.hファイルを作成することを検討してください。

#include <Player.h> 

Player john; 

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

をCPPこれはPlayer署名が知られており、有効なインスタンスがグローバルに宣言されていることを確認します。

+0

あなたはインクルードガード(または他のもの)のために予約された名前を使用してはいけません。そうでなければ[this](http://stackoverflow.com/questions/3345159/in-c-whats-soec-special-about-move-h ) 発生する可能性があります。 –

+0

私はいくつかのセミコロンを追加し、Mikeが指摘しているエラーを修正しました。(アンダースコアと大文字で始まる識別子は予約されています) –

3

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 
0
  1. あなたは、外部リンケージを持っており、すでにいくつかの他のファイルで定義されている変数を使用するexternを使用し
  2. あなたのヘッダファイルで、Playerクラスを定義する必要があります。

例:ファイルa.cppがあり、このファイルの中にグローバル変数Player pがあります。ファイルc.cppPlayerの同じ正確なインスタンスpを使用する場合は、ファイルc.cppの中にextern Player pと記述します。

私は自分自身を明確にしたいと思う。

+0

これらのタイプの議論はコメント領域に置かれています。 –

関連する問題