1

あるクラスのメンバーを別のクラスのコンストラクター内に割り当てようとしています。しかし、「メンバーが非公開のため割り当てられません」というエラーが表示されます。コードは次のようなものです:

Class Class1 {
    private:
        string name;
        string city;
}

Class Class2 {
    private: 
        string id;
        string age;

            Class1 var; //Class1 type variable defined.

    Public:    
        Class2(){   // Now I will define constructor.

        }
        Class2(Class1&, string name1, string city1) {
            var.name = name1;     // error reported , class1 private member
            var.city = city1;     // error reported , class1 private member
        }
}
4

6 に答える 6

1

class2 から class1 のプライベート メンバーに値を割り当てることはできません。

変数 name と city を初期化するコンストラクターをクラス 1 に作成します。

Class1(string n, string c)
{
 name=n;
 city=c;
}

次に、class2 コンストラクターで、そのコンストラクターを次のように呼び出します。

Class2(Class1&, string name1, string city1) 
{
   var = Class1(name1,city1);        
}

あなたのコードスニペットに基づいて私が提案できる最高のものです。

于 2012-11-23T20:59:41.280 に答える
1

まず、いくつかの簡単な問題を片付けましょう。Class Class1 { ... }クラスを定義するために使用していますclass Class1 { ... };。つまり、キーワードは is でclassあり、セミコロンで定義を終了する必要があります。さらに、Class2コンストラクターの最初のパラメーターは型Class1&ですが、使用していません。Class1ここに渡したものはすべて無駄になります。

あなたの例でvarは、タイプClass1であり、のメンバーですClass2。これは、プライベート メンバーClass2にアクセスできる特別な特権を与えるものではありません。Class1彼らは完全にプライベートです。

あなたのタイトルでは、コンストラクターをオーバーライドしていると言っています。オーバーライドは、クラスの継承にのみ適用されます。別のクラスを継承するクラスは、そのメンバー関数をオーバーライドできます。Class1したがって、現時点では、基本クラスまたは のメンバーになりたいかどうかは不明ですClass2

継承が必要な場合は、 の宣言をClass2に変更する必要がありますclass Class2 : public Class1 { ... };。これは からClass2継承することを意味しClass1ます。Class1ただし、メンバーは非公開であるため、アクセスすることはできません。それらを派生クラスで使用できるようにするには、それらを作成するか、protectedまたはpublic前者を優先する必要があります。

class Class1 {
  protected:
    Class1(string name, string city) : name(name), city(city) { }
    string name;
    string city;
};

class Class2 : public Class1 {
  private: 
    string id;
    string age;

  public:
    Class2(string name1, string city1)
      : Class1(name1, city1)
    { }
};

代わりに構成が必要な場合、つまりClass1のメンバーである場合は、のメンバーを設定する何らかの方法をClass2提供する必要があります。現時点では、そのメンバーはプライベートであるため、何もできません。それらを作成することもできますが、それは非常にお勧めできません。それを行うためのより良い方法の 1 つは、次のことができる publicと関数を提供することです。Class2Class1publicsetNamesetCityClass1Class2

var.setName(name1);
var.setCity(city1);

さらに良いことに、セッターを目的として作成するのはかなり悪い設計だと思う傾向があるためClass、名前と都市を設定varし、Class1の初期化リストで初期化するコンストラクターを指定する必要があります。

class Class1 {
  public:
    Class1(const string& name, const string& city)
      : name(name), city(city)
    { }
  private:
    string name;
    string city;
};

class Class2 {
  private: 
    string id;
    string age;
    Class1 var;

  public:
    Class2(string name1, string city1)
      : var(name1, city1)
    { }
};
于 2012-11-23T20:21:49.327 に答える
0

コンパイラが言うように、名前と都市はClass1 1にプライベートであるため、クラス2内からのみアクセスできます。

名前と都市を使用する唯一の方法は、名前と都市を引数として取るCtorをClass1に追加し、それらの値を取得して設定するための(パブリック)メソッド(ゲッター/セッター)を提供することです。

于 2012-11-23T20:05:11.120 に答える
0

そのクラスの外部でプライベートメンバー変数を設定することはできません。

保護(継承を使用している場合)、パブリック(簡単な方法)、または(これまでで最高です!)セッター関数とゲッター関数を作成し、それらの関数をパブリックにしてみてください。

単純に(実際には過度に単純化されています)、すべての変数をプライベートにし、一部の関数をパブリックにします。プライベートでクラス外で呼び出す場合は、各変数にsetter関数とgetter関数が必要です。

http://www.cplusplus.com/forum/beginner/70937/

于 2012-11-23T20:05:18.157 に答える
0

他の人が述べているように、別の (フレンドではない) タイプからタイプのプライベート メンバーにアクセスすることはできません。これまで。

また、メンバーを 2 段階で初期化していますvarが、まったく不要と思われます。適切なコンストラクタを書く

Class1::Class1(std::string const& name, std::string const& city)
: name(name), city(city) {
}

そしてそれを呼び出すClass2

// what is that first parameter for?
Class2(Class1&, string name, string city)
: var(name,city) {
}

のコンストラクターを public にすることClass1も、private にして明示的に befriend にすることもできますClass2

于 2012-11-23T20:13:42.943 に答える