我有一个具有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;
}
答案 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;
}
请勿致电new
。你真的不需要它。正如目前接受的答案所指出的那样,使用指针是导致问题的根本原因。
请勿使用using namespace std;
。它引入了微妙的错误(程序中没有错误,但最好避免它。)
如果您的意思是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
参数的参考)。