1

テンプレートクラスTripleの実装があります。これは、任意の3つのタイプを保持するコンテナです。私の問題は、私のクラスがパラメーターとして値への3つのconst参照を取り、値がプライベート(定義)である必要があることですが、コピーコンストラクターとオーバーロードされた代入演算子も実装する必要があります。

template <typename T1, typename T2, typename T3>
    class Triple
{
public:
    Triple()
    { }
    Triple(const T1 &a, const T2 &b, const T3 &c) : a(a), b(b), c(c)
    { }

    // copy constructor
    Triple(const Triple &triple) {
        a = triple.first();
        b = triple.second();
        c = triple.third();
    }

    // assignment operator
    Triple &operator=(const Triple& other) {
        //Check for self-assignment
        if (this == &other)
            return *this;

        a = other.first();
        b = other.second();
        c = other.third();

        return *this;
    }

  private:
    T1 const& a;
    T2 const& b;
    T3 const& c;
 };

const変数に割り当てずに、コピーコンストラクターと代入演算子をどのように実装しますか?

4

1 に答える 1

5

オブジェクトの存続期間がオブジェクトの存続期間よりも長持ちすることを(一般に)知ることができないため、おそらくメンバーとしてconst参照を使用しないでください。またa、ほぼ確実にタイプであり、ではないはずです。bcTxTx const&

これを知っいる場合(C ++のエキスパートでない限り、その影響を理解していない可能性が高くなります)、初期化リストを使用してコピーコンストラクターを作成できます。

Triple(const Triple& other) {
  : a(other.a)
  , b(other.b)
  , c(other.c)
{ }

参照に割り当てると、参照ではなく参照されるオブジェクトが変更されるため、代入演算子を使用できません。ポインタを使用して参照をシミュレートできますが、これは希望どおりではないと思うので、詳しく説明しません。

いずれにせよ、あなたがしなければならないstd::tuple本当のことは、車輪の再発明ではなく、使用することです。

于 2012-10-15T09:44:14.793 に答える