1

基本データメンバークラスがあります:

class DataClass {
}

およびサブクラス:

class DerivedDataClass : public DataClass {
}

DataClassをクラスDataClassListのプライベートメンバーとして使用します

class DataClassList {
  public:
    // some useful functions here
  private:
    DataClass private_data;
}

DataClassListをサブクラス化して、DerivedDataClassを操作できるクラスを作成したい

class DerivedDataClassList : public DataClassList {
  // how do i get this class to use DerivedDataClass as the private member?
}

これはC++で何らかの形で実行できますか?

編集:私がやろうとしていることにいくつかのメモを追加します:

DataClass再定義したくない便利な機能がいくつかDerivedDataClassありDerivedDataClass、独自の機能があります。したがって、継承は理にかなっています。これまでのところすべてが良好です。

次のレベルは問題です。DataClassList機能に依存する便利な機能がありDataClassます。基本クラスによって提供される便利な関数に加えてDerivedDataClassList、からデータ/実行関数にアクセスする必要があります。DerivedDataClass

DataClassプライベートメンバーDataClassListをに変更できなければ、から関数をDerivedDataClass呼び出すことはできません。DerivedDataClassDerivedDataClassList

4

3 に答える 3

3

基本的に、あなたはしません。プライベートはプライベートを意味します-それはそのクラスだけに属します。正しい方法は、アクセサ機能を使用することです。

このクラスがそのメンバーにアクセスするための特定の要件がある場合は、保護する必要があります[ただし、保護がまったく提供されないため、これはかなりばかげた概念です。そのフィールドにアクセスしたい人は、クラス、そして出来上がり、彼らは無料でアクセスできます]。

私が少し逃したことを指摘してくれたjogojapanに感謝します。テンプレートを使用した答えは1つの解決策です。もう1つは、基本クラスでポインターを使用し、アクセサー関数private_dataで提供されたクラスメンバーにを設定することです。どちらが「正しい」かは、何をしたいかによって異なります。たとえば、ある種の要素(たとえば、グラフィカルオブジェクト(ウィンドウ、メニューなど)またはゲームオブジェクト)のリストであり、実際にそれらを1つのリスト[またはいくつかの同様のリスト]にしたい場合は、ポインターを使用するのが適切です。解決。一般的な方法で使用されることのない、いくつかの異なるタイプのオブジェクトがある場合は、テンプレートクラスがおそらく正しい方法です。

于 2013-01-01T11:28:06.097 に答える
2

これに継承を使用するとすぐにprivate_data、基本クラスから、アクセスできないものではありますが、派生クラスのメンバーとしてメンバーを取得します。派生クラスの基本クラスメンバーのデータ型を変更することはできません。

あなたの状況では、クラステンプレートを使用する方が良いと思います。

template <typename Data>
class DataClassList
{
public:
  /*...*/
private:
  Data private_data;
};

上記の定義を1回だけ記述する必要がありますが、次のようにインスタンスを作成できます。

DataClassList<DataClass>         standard_list;
DataClassList<DerivedDataClass>  derived_list;

前者はメンバーを含むオブジェクトでありDataClass、後者はメンバーを含むDerivedDataClass(そして他のメンバーを含まない)オブジェクトです。

于 2013-01-01T11:31:05.733 に答える
1

DataClassでオブジェクトprivate_dataを使用することを想定していますDerivedDataClassList。を使用する場合は、どこかDerivedDataClassのオブジェクトを宣言する必要がありますDerivedDataClass(どこのオブジェクトも表示されませんDerivedDataClass)。または、継承する必要がありDerivedDataClassます。これも、コードには表示されません。

class DataClassList 
{
    protected:
        DataClass private_data;
};

class DerivedDataClassList : private DataClassList 
{
    // DataClass object private_data is like a private member here
};

の代わりにのメンバーprivate_dataとして作成し、のを作成すると、のメンバーのように動作します。protectedDataClassListprivateDataClassListprivate base classDerivedDataClassListprivate_dataprivateDerivedDataClassList

元の質問の入力ミスがなく、実際にDerivedDataClassオブジェクトをプライベートメンバーとして必要な場合は、ポインターを使用できます。

class DataClassList 
{
    public:
        DataClassList(DataClass * p) : private_data(p) {}
    protected:
        DataClass * private_data;
};

class DerivedDataClassList : private DataClassList 
{
    public:
    DerivedDataClassList():DataClassList(new DerivedDataClass) { }

    // private_data which a pointer to a DerivedDataClass object is like a private member here. 
};
于 2013-01-01T11:27:37.913 に答える