4

我有一个任务类,它有一个string text私人成员。我访问变量 trough const string getText() const;

我想重载==运算符以检查对象的不同实例是否具有相同的文本。

我已经bool operator==( const Task text2 ) const;在类头上声明了一个 public 并像这样编码:

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仅当两个指针指向同一个对象或两者都为空时才会产生)。

如果要比较需要取消引用指针的对象:

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)或者您将简单地检查地址是否相同,这显然总是错误的。

于 2012-10-06T22:28:10.000 回答
2

您正在比较指针...尝试*t == *t2

于 2012-10-06T22:27:59.387 回答
1

getText如果访问器是公共的,则无需定义为成员函数,并且绝对不需要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 回答