1

クラス外の非静的データメンバーにアクセスすることは可能ですか?次のような例があるとします。例としてはあまり意味がないことは知っていますが、静的でないデータメンバーにアクセスする方法を理解したいだけです。以下をコンパイルすると、エラーが発生します。

 C.h|70|error: invalid use of non-static data member ‘C::age’|

// Ch

class C{
  public:
    int age;
};
 int getAge();

//C.cpp

C::C()
{
    age  = 0;
}
int getAge(){
   return (C::age);
}
4

3 に答える 3

3

非静的メンバーはインスタンスに依存します。これらは、有効なインスタンスが初期化されるときに初期化されます。

この例の問題は、最初に具象インスタンスを初期化せずに、クラスインターフェイスを介して非静的メンバーにアクセスしようとすることです。これは無効です。

あなたはそれを作ることができますstatic

class C{
public:
    static int age;
};

ageこれには、実行時に使用する前に次のように定義する必要がありますint C::age = 0。このメソッドを使用すると、の値をC::age実行時に変更できることに注意してください。

または、次のように作成しconst staticて直接初期化することもできます。

class C{
public:
    const static int age = 0;
};

この場合、の値はC::ageですconst

どちらも、インスタンスなしで取得できますC::age

于 2013-03-17T19:56:17.267 に答える
3

静的にしないと、値を作成する必要があります。

左辺値:

C c;

return c.age;

または右辺値:

return C().age;
// or
return C{}.age;

ageコードの問題は、クラスのインスタンスを作成せずにメンバーにアクセスしようとすることです。クラスの非静的データメンバーには、クラスのインスタンスを介してのみアクセスでき、この場合、インスタンスは作成されません。

于 2013-03-17T19:57:14.313 に答える
1

実行できない理由は、ローカル変数が実行時にスタックに割り当てられるためです。インラインasmを使用して本当に必要な場合はその位置を取得できますが、スタック位置以降を取得するにはデバッグが必要になります。関数)アクセスしたい場合は、他の何かによって長い間上書きされている可能性が高くなります。

于 2013-03-17T23:30:17.977 に答える