2017-06-23 9 views
0

私はコードフローリングを実行してフローコントロールを必要とします。つまり、一度に1つずつデータを送信する必要があります。これを解決するにはどうすればグローバル変数を使うことができますか?グローバル変数が機能しない場合、異なるクラスにある可能性のある倍数関数の変数にアクセスして修正する方法は何ですか?C++のさまざまなクラスでグローバル変数にアクセスして変更することができます

私は以下を試しました(部分コードを貼り付けています)が、解決しない。私はこの問題を解決するために何が最善の、そしてきれいなアプローチかもしれないのか尋ねたい。

file1.h

int data_received; //global variable 
class abc 
{ 
. 
. 
. 
public: 
    void send_data(..) 
. 
. 
. 
}; 

FILE1.C

​​

file2.c

//data receive class 

void transmit_data() 
{ 
.... 
.... 
.... 
//data sent upstream 
data_received = 1; 
} 

私が上で多くの記事を検索しましたstackoverflowしかし、明確な答えはありません。 extern変数を使用することを推奨しますが、複数のクラス関数で変更される外部変数の明確な例はありません。

答えて

1

CおよびC++での

  • DeclareDefineについての詳細を学ぶしてください。
  • compilelink

defineグローバル変数

// file1.cpp 
int data_received; 

externdata_receivedをするとき、リンカを見つけることができることをコンパイラに伝えます。

// file2.cpp 
extern int data_received; 

加え、staticmy_global_varのみ制限することができ、それを定義するファイルで使用されます。私が書いたように例

// file3.cpp 
static int my_global_var = 1; 

エラーがlinker

// file4.cpp 
extern int my_global_var; 
+0

ありがとうございます。 class_name :: my_global_varを使用して、別のクラスの関数でこの静的変数にアクセスできますか?クラスを#includeする必要がありますか? – user2979872

+0

他のファイル/関数の 'static member'にアクセスすることができます。 C++でstaticキーワードを学んでください。確かに、 '#include'が必要です(コンパイルのステップで、コンパイルする場所を指定する必要があります)。 – Jcppython

+0

@ user2979872別の 'compile'と' link'についてもっと学んでください。それはあなたを助けるでしょう。 – Jcppython

1

は、次のいずれかの例

file1.h

extern int data_received; 

についてはfile1.cまたはfile2.c

で、ヘッダファイルでそのexternをマークし、それが一度定​​義する必要がありますfile1.c

// initialize it 
int data_received = 0; 

file2.c

// either do this if the include is logically needed 
#include "file1.h" 
// or 
extern int data_received; 

// then use it normally 
void foo() { 
    cout << data_received << endl; 
} 

それとも、これはあなたが、クラスのstatic変数としてその変数を宣言し.cppファイルに定義し、通常の変数と同じように使用することができ++ Cである場合クラスのスコープ解決のプレフィックスが付いています。例えば、

class Something { 
public: 
    static int data_received = 0; 
}; 

void foo() { 
    cout << Something::data_received << endl; 
} 
+0

に発生します。私は別のクラスの関数内の変数を変更する必要があります。関数内で関数externを使うことはできません。あなたがそう思っている場合、あなたのコードを投稿してください – user2979872

+0

@ user2979872投稿コード – Curious

+0

あなたのコードでwhileループの次の繰り返しに行く方法はありますか? – user2979872

1

グローバル変数をヘッダファイルに設定することで、そのヘッダファイルに含まれるcファイルにそのコピーを作成します。そこではldは不平を言うでしょう。 ヘッダーファイルで 'extern'と宣言してから、単一の 'c'ファイルで定義する必要があります。

file1.h

extern int data_received; 

FILE1.C

#include <file1.h> 
int data_received = 0; 

FILE2。c

このようにして、1つのコピーのみを定義し、ヘッダーファイルを含むすべてのファイルにそのことを知らせます。

+0

あなたが「好奇心」を示唆している場合は、ヘッダーファイルに「extern」として宣言する必要はありません。 file2.cに定義されている変数のコピーが1つあるだけで、file2.cにそれを認識させるだけです。どちらの解決策も正しいです。あなたの選択。 – Serge

関連する問題