4

数値メソッドを作成するためにLineクラスを作成していますが、これらの演算子(*、+、-)を使用して、コードを読みやすく、理解しやすくしたいと考えています。

        #include <vector>

        using namespace std;

        typedef vector<double> Vector;

        class Line : public Vector
        {
        public:
            Line();
            ~Line();

            Line operator+(Line);
            Line operator-(Line);
            Line operator*(double);
        };


        Line Line::operator*(double alfa)
        {
            Line temp;
            int n = size();
            temp.resize(n);
            for (int i = 0; i < n; i++)
            {
                temp.at(i) = this->at(i)*alfa;
            }
            return temp;
        }

        Line Line::operator+(Line line)
        {
            int n = size();
            Line temp;
            temp.resize(n);
            for (int i = 0; i < n; i++)
            {
                temp.at(i) = this->at(i) + line[i];
            }
            return temp;
        }

        Line Line::operator-(Line line)
        {
            int n = size();
            Line temp;
            temp.resize(n);
            for (int i = 0; i < n; i++)
            {
                temp.at(i) = this->at(i) - line[i];
            }
            return temp;
        }


        int main()
        {
            return 0;
        }

Vectorクラスからそのような演算子をオーバーロードすることは可能ですか?演算子の代わりに関数(またはメソッド)を作成する必要がありますか?他に何か提案はありますか?

ps1:コンパイラとしてVisualStudio11を使用しています。

ps2:プロジェクトを「win32プロジェクト」として開始していません。コンソールアプリケーションです。

次のエラーが発生します。

Error   1   error LNK2019: unresolved external symbol "public: __thiscall Line::Line(void)" (??0Line@@QAE@XZ) referenced in function "public: class Line __thiscall Line::operator*(double)" (??DLine@@QAE?AV0@N@Z) C:\Users\Lucas\Documents\Visual Studio 11\Projects\test\test\test.obj   test


Error   2   error LNK2019: unresolved external symbol "public: __thiscall Line::~Line(void)" (??1Line@@QAE@XZ) referenced in function "public: class Line __thiscall Line::operator*(double)" (??DLine@@QAE?AV0@N@Z)    C:\Users\Lucas\Documents\Visual Studio 11\Projects\test\test\test.obj   test
4

4 に答える 4

5

グローバル スコープで演算子をオーバーロードする必要があります。

vector<double> operator*(const vector<double>& v, double alfa)
{
    ...
}

vector<double> operator+(const vector<double>& v1, const vector<double>& v2)
{
    ...
}

vector<double> operator-(const vector<double>& v1, const vector<double>& v2)
{
    ...
}

リンカ エラーに関しては、Line コンストラクタとデストラクタを実装していないようです。

于 2013-01-20T00:00:55.540 に答える
2

std継承を意図していない -classesから継承するべきではありません。仮想デストラクタを持たないクラスからの継承は非常に危険です。

集約を使用することをお勧めします。たとえば、名前付きLineの型のメンバーをクラスに含め、このメンバー変数を使用する方法で目的の演算子を実装します。vectormyVector_

size()したがって、すべての呼び出しをmyVector.size()etcに置き換えます。

Line Line::operator*(double alfa)
{
    Vector temp;
    int n = myVector_.size();
    temp.resize(n);
    for (int i = 0; i < n; i++)
    {
        temp.at(i) = myVector_.at(i)*alfa;
    }
    return temp;
}
于 2013-01-19T23:58:38.143 に答える
1

リンカー エラーは、宣言した 2 つのメンバー関数 (コンストラクターとデストラクター) の定義がコードにないことを示しています。

Line::Line() {
    // Code of the constructor goes here
}

Line::~Line() {
    // Code of the destructor goes here
}
于 2013-01-19T23:57:43.003 に答える
0

確かに正しいことは、ベクトルから「継承」するのではなく、ベクトルオブジェクトを行内に持つことですか? 一般に、コンテナーからの継承std::は優れたデータではありません...「Line」は実際にはベクターではなく、「has a」ベクターであると確信しています。[「継承する場合」のルールは「X は Y である」であり、「X には Y がある」場合に複合オブジェクトを作成するため、X の中に Y があります。]

リンク エラーを取り除くには、コンストラクタとデストラクタを宣言する必要があります。

const Line&入力を変更する必要がないため、数学演算への入力としても使用します。

于 2013-01-19T23:59:58.363 に答える