2

次の 3 つのクラスがあるとします。

typedef struct base
{
    float A;
    float B;
    ...
    base() : A(1.0f), B(1.0f) {}
} base;

class derived1 : base
{
    int C;
    int D;
};

class derived2 : base
{
    int E;
    int F;
};

そして、基底クラスのデータをある派生クラス オブジェクトから別の派生クラス オブジェクトにコピーしたいと考えています。
A、B などの基本クラスの値のみをあるオブジェクトから別のオブジェクトにコピーするために、次のことを行っても安全ですか?

derived1* object1 = new derived1;
derived2* object2 = new derived2;

void make_object1()
{
    object1->C = 2;
    object1->D = 3;
}

void make_object2()
}
    object2->A = 4;
    object2->B = 5;
    object2->E = 6;
    object2->F = 7;
}

void transfer_base()
{
    *((base*)object1) = *((base*)object2);
}

私のプログラムがこの種の操作を頻繁に行う必要があると仮定すると、これを達成するためのより良い (より高速なコード) 方法はありますか? これを行う理由は、シミュレーションとグラフィカル レンダラーを作成したからです。シミュレーション内のオブジェクトから選択したデータのみを使用して、グラフィック表示オブジェクトをできるだけ効率的に更新したいと考えています。シミュレーションは非常にCPUを集中的に使用します...これまでのところ、このアプローチは機能しているようですが、見落としがあるのではないかと心配しています...

4

2 に答える 2

3

コード

*((base*)object1) = *((base*)object2);

C スタイルのキャストはほぼ何でもできるため、非常に安全ではありません。再解釈や一貫性を捨てるなど。

代わりに、 を呼び出したい場合はbase::operator=、それを明示的に呼び出します。明示的 = 良い、暗黙的 = 悪い。

すなわち、

object1->base::operator=( *object2 );

スライスによって派生クラスのクラス不変条件が壊れる可能性があるため、これはまだ「安全」ではありません。そして、このコードで何が起こっているのかを把握しようとする人は、基本クラスのサブオブジェクトの値が突然変化したことに驚くかもしれません。また、これらの値がどこから来ているのかを確認するために多くの時間を浪費する可能性があります。しかし、少なくとも C スタイルのキャストほど悪くはありません。

于 2013-03-28T00:39:23.967 に答える
0

代わりに、基本クラスで独自の割り当てメソッドを作成してみませんか (不要な C アーティファクトの型定義を削除します)。

struct base
{
    float A;
    float B;
    ...
    base() : A(1.0f), B(1.0f) {}
    base& assign_base(const base& right) { A = right.A; B = right.B; }
};

それからあなたはただ言うことができます

der1.assign_base(der2);
于 2013-03-28T00:48:44.547 に答える