0

私がこれまでに持っているコード:

#include <iostream>
#include <vector>

using namespace std;

class Dictionary
{
private:
    string dictName;
    struct wordCard
    {
        string word;
        string translation;
    };
    vector<wordCard> Dict;
    bool foundit = false;
public:
    // My attemtp at swap function for copy-and-swap:
    void swap(Dictionary& dict1, Dictionary& dict2)
    {
        Dictionary dict3("tmp");
        dict3.dictName = dict1.dictName;
        dict3.Dict = dict1.Dict;
        dict1.dictName = dict2.dictName;
        dict1.Dict = dict2.Dict;
        dict2.dictName = dict3.dictName;
        dict2.Dict = dict3.Dict;
    }
    // Very basic constructor (setting the dictionary name while creating an object was part of the assignment):
    Dictionary(string name)
    {
        setDictName(name);
    }

    /* various functions that work fine */

    // Overloading "+" operator:
    // The result is supposed to be a new dictionary (without changing the source) where all words from the
    // original dictionaries are present without doubles.
    Dictionary& operator+ (const Dictionary& dict)
    {
        bool doubleword = false;
        string plusname;
        plusname = "Augmenting " + this->dictName + " & " + dict.dictName;
        Dictionary plusDict(plusname);
        plusDict.Dict = this->Dict;
        for (int i = 0; i < dict.Dict.size(); i++)
        {
            doubleword = false;
            for (int i2 = 0; i2 < plusDict.Dict.size(); i2++)
            {
                if (plusDict.Dict[i2].word == dict.Dict[i].word)
                {
                    doubleword = true;
                }
            }
            if (!doubleword)
            {
                plusDict.Dict.push_back(dict.Dict[i]);
            }
        }
        return *this;
    }

    /* 2 other overloads that are very similar */

    // Overloading "=" operator (using copy-and-swap):
    // Not part of the assignment, but I couldn't think of another way to make the other operators work.
    Dictionary& operator=(Dictionary dict)
    {
        swap(*this, dict);
        return *this;
    }
};

そして私がそれに関して持っている問題:

理想的には、次のように機能する必要があります。

Obj1 = result of operation Obj2 + Obj3;

私が今得ているのは:

Obj1 = Obj2 (ignores Obj3)

なぜそれが起こるのか漠然とした考えがあります(または、実際には2つの考え)。まず、実際の結果ではなく、をoperator+返します。*thisしかし、それを一時クラスオブジェクトに変更しようとすると、コンパイラが私に向かって叫び始めました。次に、ローカル変数(一時クラスオブジェクト)を使用していることは認識していますが、後で使用できるように公開する方法がわかりません。public:セクション(または)にクラスオブジェクトを追加しようとするとprivate:、コンパイラはそれをクラスオブジェクトではなく、関数宣言として扱います。

では、どうすれば一時クラスオブジェクトを公開するか、のa+b代わりに結果を返すか、結果またはそれが返すものの代わりに結果*thisoperator=キャッチすることoperator+ができますか?

4

1 に答える 1

2

operator +値で新しいオブジェクトを返し、constである必要があります-つまり、

Dictionary operator+ (const Dictionary& dict) const
{
    Dictionary ret;
    //modify ret
    return ret;
}
于 2013-02-27T12:40:34.867 に答える