2012-01-25 6 views
2

私はstd::vector<unsigned int>から派生したクラスStepを持っています。静的メソッドから返された値の代入に使用されるディープコピーのために、代入演算子をオーバーロードする必要があります。私は割り当てにthisrhvのすべての要素をコピーしてください方法をfigurすることはできません。std :: vectorサブクラスのオーバーロードされた代入演算子でディープコピーを行う方法<T>?

class Step : public std::vector<unsigned int> 
{ 
public: 
    friend std::ostream& operator<<(std::ostream& outStream, const Step& step); 
    Step& operator =(const Step& rhv); 
    static Step fromString(const std::string &input); 
    // Something like: Step x = Step::fromString("12 13 14 15 16"); 
private: 
    double time; 
    double pause; 
    unsigned int id; 
    std::string name; 
}; 

、その後=をオーバーロード:彼らので、標準コンテナからの継承

Step& Step::operator =(const Step& rhv) 
{ 
    time = rhv.time; 
    pause = rhv.pause; 
    id = rhv.id; 
    // How should I copy contents of rhv to `this` safely? 
    return *this; 
} 
+5

標準ライブラリのコンテナから派生しないようにしてください。彼らはそれのために設計されていないので、あなたは安全にそれを行うことに非常に注意しなければなりません。とにかく 'std :: vector'から継承したいのはなぜですか? – jalf

+4

なぜ割り当てオペレータに過負荷をかけなければならないのですか?あなたが手動のリソース管理を行っていないので、コンパイラは、私がそれを見ているようにうまく動作するはずです。 – Grizzly

答えて

4

私はあなたの質問から100%確実ではありませんが、私はあなたに親を呼び出すことについて質問していると思いますoperator=。 、あなたが手動リソースの取り扱いをしない私たちを示しているので、あなたがあなた自身の代入演算子を書きたい、なぜ私が表示されていないコードではもちろん

std::vector<unsigned int>::operator=(rhv); //either explicitly call the parent assignment op 
*static_cast<std::vector<unsigned int>*>(this) = rhv; //or cast this to parentclass and call assignment on that 

:その場合は次の2つのオプションがありますコンパイラが生成したものはうまくいくはずです。あなた自身の代入演算子を書く場合は、rule of threeを使い、独自のコピーコンストラクタとデストラクタも書くことができます(少なくともC++ 03では、C++ 11は移動可能だがコピーできないクラスのために少し異なる可能性があります) 。別の追記として

:あなたは本当にためoperator=をオーバーロードする必要はありません。この場合、フォームstd::vector

+0

主観的ですが、 'static_cast &>(* this ) '私はもっと読みやすいです。 – ildjarn

+0

'this-> assign(rhv.begin()、rhv.end())'も動作します。私は 'static_cast &>(* this)'を使用します。ありがとう –

3

は一般的に悪い考えと考えられています基本クラス(他のものの中では仮想デストラクタはありません)として使用するようには設計されていません。ほとんどの場合、組成が好ましい。

この地雷鉱区に入ることを決めたとすると、static_castの親代入演算子を呼び出すことができます。

*static_cast<std::vector<unsigned int>*>(this) = rhv;

と同様nameを割り当てることを忘れないでください。

1

を継承することができrequieringあなたのデザインを再考する場合がありますので、ほとんどのstandardlibraryクラスは、由来するように設計されていません生成されたデフォルトのものは(各メンバーと基本クラスを順番に割り当てることによって)うまく動作します。

独自の演算子を定義した場合、あなたは

std::vector<unsigned int>::operator=(rhv); 

別の基底クラスの関数を呼び出すと、ベクターは、独自の割り当てを処理させるのと同じように、基本クラスのオペレーターを呼び出すことができます。

関連する問題