2

C++ でのランタイム ポインターの割り当ての問題に悩まされています。私は base2つのメンバースレッドとスレッドを持つクラスを持っています。

class base {

    struct base_struct {
        int a;
    };
    base_struct thread;
    std::vector<base_struct> threads;

    void fn () {}

};

derived1から派生しbase、同じ 2 つのメンバー (threadおよび threads) を持ちますが、型は異なります。

class derived1 : public base {
    struct derived_struct11 : public base_struct {
        int b;
    };
    derived_struct11 thread;
    std::vector<derived_struct11> threads;

    void fn () {
        printf();
    }

};

derived2も派生しbase、同じ 2 つのメンバー (thread およびthreads) を持ちますが、型は異なります。

class derived2 : public base {
    struct derived_struct22 : public base_struct {
        int c;
    };
    derived_struct22 thread;
    std::vector<derived_struct22> threads;

    void fn () {
        printf();
    }

};

実行時にのみ、使用するかどうかを知ることができderived1ますderived2。だから私は次の方法でそれをやった:

base base_obj;
derived1 derived1_obj;
derived2 derived2_obj;

base *ptr ;

実行時関数:

{
    if (condition == yes)
        ptr = &derived1_obj;

    else
        ptr = &derived2_obj;
}

問題は、ポインターを使用して関数に直接アクセスできることですthis。ただし、スレッドの値 (例:threads.size()は常にbase クラスの値として表示されます。

これを実装するためのより良い方法を知りたいです。

4

2 に答える 2

2

直接的な問題は、データ メンバーを仮想にすることができないためthreads、派生クラスでオーバーライドできないことです。1 つの解決策は、基本クラスに 1 つだけを持ちthreads、そこにすべての構造体インスタンスを格納することです。

ただし、スライスの問題に遭遇します。オブジェクトを値で に格納していますstd::vector<base_struct>。これは、オブジェクトをそこに入れるたびに、 の (生成された) コピー コンストラクターを使用してベクターにコピーされることを意味しますbase_struct。つまり、元のオブジェクトの派生部分が切り捨てられ、base_struct要素のみが取得されます。

ポリモーフィズムを有効にするにbase_structは、ベクターにポインターのみを格納する必要があります。

std::vector<base_struct*> threads;

もう 1 つの方法は、 に仮想ゲッターを提供することthreadsです。これを派生クラスでオーバーライドして、目的のコレクションを返すことができます。ただし、クラス階層に同じ名前のデータ メンバーを複数持つことは、IMO ではお勧めできません。人々を混乱させ、微妙なバグを引き起こす可能性があります。したがって、各クラスに個別のコレクションを保持する非常に差し迫った理由がない限り、最初のソリューションをお勧めします。

于 2012-05-15T10:36:33.543 に答える
0

1つの方法は

base_struct* thread;
std::vector<base_struct*> threads; // <- hmmmmmmm

次に、派生クラスで、基本メンバーを適切に設定します(派生クラスで2つの新しいメンバーを定義するのではなく、とにかく探しているものではないと思います)

于 2012-05-15T10:39:18.267 に答える