6

C ++オブジェクトAを作成しましょう。Aには、その子がアクセスできる2つの変数(VAR1とVAR2)があります。オブジェクトBはAを拡張し、1つのプライベート変数VAR3を持ち、VAR1とVAR2にもアクセスできます。A/Bの各インスタンスには独自の変数があります。

これは、変数を宣言および定義する正しい方法でしょうか?

ああ


class A {
protected:
    static std::string const VAR1;
    static std::string VAR2;
};

A.cpp


#include "A.h"
using namespace std;
string const A::VAR1 = "blah";
string A::VAR2;

Bh


#include "A.h"
class B : public A {
private:
    static std::string VAR3;

public:
    B(std::string const v1, std::string const v2);
    void m() const;
};

B.cpp


#include "B.h"
using namespace std;

string B::VAR3;

B::B(string const v1, string const v2) {
    VAR2 = v1;
    VAR3 = v2;
}

void B::m() const {
    // Print VAR1, VAR2 and VAR3.
}
4

4 に答える 4

4

A/B の各インスタンスには、独自の変数があります。

これは、変数を宣言および定義する正しい方法でしょうか?

いいえ。Aのメンバーを として宣言しました。staticこれは、インスタンス変数ではなく、クラス変数であることを意味します。各インスタンスは独自のコピーを取得しません。代わりに、それらはすべて同じインスタンスを共有します。

してから非にするstatic

class A {
protected:
    std::string const VAR1;
    std::string VAR2;
};

...そしてもちろん、グローバル初期化子は必要ないので、これを取り除きます:

string const A::VAR1 = "blah";
string A::VAR2;

...そして、インスタンス化さVAR1れるたびにデフォルト値が必要なA場合は、クラスの初期化子リストで(またはパンクの場合は ctor 本体で)それを行うことができます :) ):

A::A() : VAR1("blah") {};
于 2011-01-31T18:32:04.547 に答える
1

A/B の各インスタンスには、独自の変数があります。

そうではありません。あなたはそれらを宣言しましたstatic。それをやめれば、望む結果に近づくかもしれません。

于 2011-01-31T18:26:50.363 に答える
1

いいえ、あなたはそれを間違えました。

  • この問題では、各インスタンスが独自の変数セットを持つ必要があるのに、なぜABのデータを として宣言しているのstaticですか?
  • 何も実装する必要はありません。この問題は、型とそのメンバー データを宣言するように求めているだけです。
  • コンストラクターは、要件で求められている限り、必要ありません。
于 2011-01-31T18:28:55.877 に答える
0
class A{
protected:
    char var1,var2;
};

class B: public A {
private:
    char var3;
};

void main()
{
    B b1;
    b1.var3='a';
}
于 2011-01-31T18:50:32.577 に答える