没有调用C ++中重载的“==”运算符?

时间:2012-10-06 22:11:32

标签: c++ operator-overloading

我有一个具有string text私有成员的Task类。我访问变量槽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。

所以我在bool operator==( const Task text2 ) const;内添加了一个cout调用来检查它是否被调用,但什么都没有。

似乎我的自定义==运算符从未被调用。

我的标题:

#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;
}

7 个答案:

答案 0 :(得分:11)

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

您不是在比较Task个对象,而是指向Task个对象的指针。指针比较是语言的原生,并比较对象的标识(即只有当两个指针引用同一个对象或两者都为空时才会产生true。)

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

if( *t == *t2 ) {

答案 1 :(得分: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表示“结束此行并刷新输出。”

答案 2 :(得分:3)

您正在比较指针,而不是指向对象。

使用if (*t == *t2)或者您只需检查地址是否相同,这显然是假的。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果getText访问者是公开的,则无需定义为成员函数,并且肯定不需要任何地方strcmp

bool operator==(const Task& lhs, const Task& rhs) {
    return lhs.getText() == rhs.getText();
}

答案 5 :(得分:1)

您不是在比较任务,而是在比较指向任务的指针。 t == t2并不代表*t == *t2。您不能为内置类型重载==运算符。

答案 6 :(得分:-1)

尝试将方法签名更改为:

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

(即,尝试使用text2参数的参考)。