1

演算子のオーバーロードに慣れていないので、一日中頭を悩ませていましたが、operator+ 関数はデータを正しく計算しますが、temp クラスのデータを operator= に渡してクラスの別のインスタンスに割り当てる必要があり、temp を返すことはできません。作業 (データは終了時に破棄されていると思いますか?) 全体のアイデアはメインからのものです x = y + z が呼び出され、y と z からの 2 つのベクトルのデータを追加し、それを x に割り当て、y + の計算を取得しますz は正しく、それを x に渡します。レンガの壁にぶつかりました。何が悪いのですか? または誰かがアイデアを持っていますか?これは私のクラスの私のコードです

VecXd& operator=(const VecXd& rhs)
{
    VecXd<V> temp;
    temp.dimension = rhs.dimension;
    cout << "operator= check dimension is..." << temp.dimension << endl;

    for(int i = 0; i < rhs.dimension; i++)  //Passing data to x?
    {
        cout << "test" << endl;
        temp.vecArr[i] = rhs.vecArr[i];
        cout << temp.vecArr[i] << " our new value" << endl;
    }
}

friend VecXd& operator+(VecXd& lhs, VecXd& rhs){

    VecXd<V> temp;
    cout << lhs.dimension << "-lhs d-" << rhs.dimension << "-rhs d-" << endl; //works
    if(lhs.dimension == rhs.dimension) //dimension level check
    {
        temp.vecArr = new V[lhs.dimension];
        for(int i = 0; i < lhs.dimension; i++)
        {
            temp.vecArr[i] = lhs.vecArr[i] + rhs.vecArr[i];
            cout << temp.vecArr[i] << " our new value" << endl;
        }
        //return *temp.vecArr;
        return temp; //***? how to pass data?
    }
    else{
        cout << "Dimensions do not match!!! Error!" << endl;
    }
}

何か案が?厳しくしないでください... ハハ... :l

4

2 に答える 2

1

あなたの代入演算子は偽物です:代入が行うはずの操作は、オブジェクトが指すthisオブジェクトを右側のオブジェクトと同じにすることです。代入演算子は一時オブジェクトを作成し、このオブジェクトをセットアップします。ただし、代入演算子を終了すると消えます。また、従来どおり参照を返す参照を返すように代入演算子を宣言しまし*thisたが、return ステートメントはありません。

別の方法で行う非常に正当な理由がない限り、代入演算子をコピー コンストラクター、デストラクター、およびswap()関数の観点から実装します。

VecXd& VecXd::operator=(VecXd rhs) 
{
    this->swap(rhs);
    return *this;
}

関数への引数を作成するためにコピー コンストラクターが呼び出され、オブジェクトが適切にコピーされます。次に、新しく作成されたコピーが割り当てられているオブジェクトのコンテンツと交換され*this、元のコンテンツが返された後、 のために作成された一時オブジェクトのデストラクタによって解放されrhsます。必要なのは相対関数だけswap()です:

void VecXd::swap(VecXd& other)
{
     std::swap(this->dimension, other.dimension);
     std::swap(this->vecArr, other.vecArr); 
}

このswap()関数は、もちろん、2 つのメンバーを交換できることを前提としています。あなたの宣言を見たことがないので、VecXdこれが機能するかどうかはわかりませんが、一般的には機能するはずです。

私はあなたの加算演算子を実際に見ていません。

于 2013-09-18T23:56:16.880 に答える
0

このCaltech C++ Operator Overloading Pageには、必要なものすべてと、関連するロジックの比較的明確な説明が含まれているはずです。そこに示されている規則やガイドラインに従うことは決して必要ではありませんが、一般的なケースではうまく機能します。

算術演算子の特定のケースでは、クリスによる元の投稿へのコメントに記載されているように、操作は += 演算子の観点から定義されることがよくあります。これは、通常、右と左の引数を渡し、lhs のコピーを作成し、lhs_copy += rhs; を使用して結果を見つけることを意味します。これを念頭に置いてコードの重複を避ける方が簡単です。+= で 1 回だけ加算ロジックを作成し、それを + で呼び出します。

返される結果を参照にすることはできません。関数内で作成されたものは保持されませんが、lhs または rhs 引数を変更する必要はありません。代わりに、インスタンスとしてインクリメントした重複した lhs を返すだけです。この場合、関数のシグネチャは次のとおりです。

const VecXd operator+(const VecXd& lhs, const VecXd& rhs). 

関数内でどちらの項目も変更されないため、入力は const にすることができます。Caltech のページでは、特定の奇妙な操作を禁止するために戻り値の型を const インスタンスにすることを推奨しています。

于 2013-09-18T23:47:23.510 に答える