2016-12-10 13 views
-1

は例えば、私は、アプリケーション名を格納するクラスを持っている:C++ - どのように私はどこでも静的関数を呼び出すことができます、そのプライベート変数を変更する?

class Storage { 
public: 
    static char* getName(); 
private: 
    char* name; 
} 

私はmain()関数では、例えば、からアクセスしたい:

#include <iostream> 

using namespace std; 

int main() { 

char* name; 

Storage s; 
name = s.getName(); 
cout << name << endl; 

return 0; 
} 

ご存知のように、静的メソッドは静的変数を使用する必要があるため、アクセスできません。私は "名前"プライベート静的にしようとしたとき、私はリンカエラーを取得します。私はそれをカプセル化したいので、パブリック静的変数を宣言したくありません。コードのすべての部分からメソッドを呼び出すため、静的にしたいと思います。

このプログラムはグローバル名を持ち、カプセル化されていなければならず、コードのすべての部分から名前に到達したいと考えてください。あなたは何をするべきか? Javaでは、プライベート静的変数は合法でした。しかしC++では非常に混乱しています。

+0

ステートメント「静的メソッドは静的変数を使用する必要があります」は意味をなさない。静的なメソッドを書くことができます。静的なメソッドは、静的な変数やその他の変数を使用する必要はありません。そして、Javaが実行される限り、Javaのクラス静的変数はC++とまったく同じように動作します。 –

答えて

0

あなたのクラスはヘッダファイルで宣言されている場合は、関数にいくつかの.cppファイルのsimillaryに静的メンバを定義する必要があります。

char* Storage::name; 

ところで、あなたのコードは、今コンパイルできますが、 'に何らかの値を割り当てる必要がありますそれを読む前に名前をつけてください。

+0

それは動作します!もう1つの質問。正当な静的法律を使用する?誰かがそれを使用するとC++仕様に違反していると言われています – user5278560

+0

はい、正しく初期化しても問題ありません。 –

+0

ありがとうございます。 – user5278560

0

あなたの名前がプログラムに静的である場合は、nameをスタティックにして、クラス外で初期化します。

// storage.h 
class Storage { 
public: 
    static char *getName(); 
private: 
    static char *name; // note: static 
}; 

// these can be in storage.cpp or storage.h 
char *Storage::getName() { return name; } 
char *Storage::name = "Inigo Montoya"; 

と同様にStorageのインスタンスからgetNameを呼び出し、それは静的だとして、あなたはまた、インスタンスせずに、それを呼び出すことができます側の注意点として

Storage s; 
cout << s.getName() << endl;  // this works 
cout << Storage::getName() << endl; // this also works 

- C++ 11の意志文字列リテラルをchar *に代入しようとすると警告が表示されます。代わりにstd::stringを使用する方がよいでしょう。

class Storage { 
public: 
    static std::string getName(); 
private: 
    static std::string name; 
}; 

std::string Storage::getName() { return name; }  
std::string Storage::name{"Inigo Montoya"}; 
関連する問題