4

string textプライベートメンバーがいるタスククラスがあります。変数トラフにアクセスしますconst string getText() const;

==オブジェクトの異なるインスタンスが同じテキストを持っているかどうかを確認するために、演算子をオーバーロードしたいと思います。

bool operator==( const Task text2 ) const;クラスヘッダーでパブリックを宣言し、次のようにコーディングしました。

bool Task::operator==( const Task text2 ) const {
     return strcmp( text.c_str(), text2.getText().c_str() ) == 0;
}

しかし、文字列が等しい場合でも、常にfalseを返していました。

そこで、にcout呼び出しを追加して、呼び出されているbool operator==( const Task text2 ) const;かどうかを確認しましたが、何も得られませんでした。

私のカスタム==演算子は呼び出されていないようです。

私のヘッダー:

#ifndef TASK_H
#define TASK_H

#include <iostream>

using namespace std;

    class Task {
        public:
            enum Status { COMPLETED, PENDIENT };
            Task(string text);
            ~Task();
            // SETTERS
            void setText(string text);
            void setStatus(Status status);
        // GETTERS
            const string getText() const;
            const bool getStatus() const;
            const int getID() const;
            const int getCount() const;
            // UTILS
            //serialize
            const void printFormatted() const;
            // OVERLOAD
            // = expression comparing text
            bool operator==( const Task &text2 ) const;
        private:
            void setID();
            static int count;
            int id;
            string text;
            Status status;
    };

    #endif

参照を使用するようにオーバーロード操作を編集し、strcmpから離れました:

bool Task::operator==( const Task &text2 ) const {
    return this->text == text2.getText();
}

メインファイル:

using namespace std;

int main() {
    Task *t = new Task("Second task");
    Task *t2 = new Task("Second task");

    cout << "Total: " << t->getCount() << endl;
    t->printFormatted();
    t2->printFormatted();

    if( t == t2 ) {
        cout << "EQUAL" << endl;
    }
    else {
        cout << "DIFF" << endl;
    }

    return 0;
}
4

7 に答える 7

12
Task *t = new Task("Second task");
Task *t2 = new Task("Second task");
// ...
if( t == t2 ) {

Taskオブジェクトを比較しているのではなく、オブジェクトへのポインタを比較していTaskます。ポインター比較は言語固有のものであり、オブジェクトの同一性を比較します (つまりtrue、2 つのポインターが同じオブジェクトを参照するか、両方が null である場合にのみ生成されます)。

オブジェクトを比較したい場合は、ポインターを逆参照する必要があります。

if( *t == *t2 ) {
于 2012-10-06T22:29:00.717 に答える
4

あなたが書いた:

C/C++ の初心者として、ポインターと参照で混乱することがあります。

この問題の解決策簡単です。ポインターを使用しないでください。C とは異なり、C++ では、ポインターを直接使用しなくても、完全に有用なプログラムを作成できます。

プログラムの書き方は次のとおりです。

int main() {
    Task t("Second task");
    Task t2("Second task");

    std::cout << "Total: " << t.getCount() << "\n";
    t.printFormatted();
    t2.printFormatted();

    if( t == t2 ) {
        std::cout << "EQUAL\n";
    }
    else {
        std::cout << "DIFF\n";
    }

    return 0;
}
  1. 電話しないでくださいnew。あなたは本当にそれを必要としませんでした。現在受け入れられている回答が指摘しているように、ポインターの使用が問題の根本的な原因です。

  2. 使用しないでくださいusing namespace std;。微妙なバグが発生します (プログラムにはありませんが、回避するのが最善です)。

  3. std::endlを意味する場合は使用しないでください'\n''\n'は「この行を終了する」という意味です。std::endl「この行を終了し、出力をフラッシュする」ことを意味します。

于 2012-10-07T01:43:14.227 に答える
3

ポイント先のオブジェクトではなく、ポインターを比較しています。

if (*t == *t2)または、単にアドレスが同じかどうかを確認しますが、これは明らかに常に false です。

于 2012-10-06T22:28:10.000 に答える
2

ポインタを比較しています...試してください*t == *t2

于 2012-10-06T22:27:59.387 に答える
1

getTextアクセサーが publicの場合、メンバー関数として定義する必要はありませstrcmp

bool operator==(const Task& lhs, const Task& rhs) {
    return lhs.getText() == rhs.getText();
}
于 2012-10-06T22:26:52.213 に答える
1

タスクを比較しているのではなく、タスクへのポインタを比較しています。t == t2という意味ではありません*t == *t2==組み込み型の演算子をオーバーロードすることはできません。

于 2012-10-06T22:28:05.257 に答える
-1

メソッドシグネチャを次のように変更してみてください。

bool Task::operator==(const Task &text2) const;

(つまり、text2パラメーターの参照を使用してみてください)。

于 2012-10-06T22:15:37.667 に答える