Пытается заставить перегрузку оператора '==' работать (C ++) - PullRequest
3 голосов
/ 20 августа 2010

Хорошо, не уверен, что я здесь делаю, кроме как это не правильно. Попытка перегрузить метод класса ==, и он просто ... не работает. По крайней мере, я получаю ложное возвращение от моего main, а cout в реализации '==' не выводит.

Это мои три файла:

// TestClass.h

#ifndef TESTCLASS_H
#define TESTCLASS_H

class TestClass {
public:
    TestClass(int contents);
    TestClass(const TestClass& orig);
    virtual ~TestClass();
    bool operator==(const TestClass& other);
private:
    int contents;
};

#endif  /* TESTCLASS_H */



// TestClass.cpp

#include <iostream>

#include "TestClass.h"

TestClass::TestClass(int contents) {
    this->contents = contents;
}

TestClass::TestClass(const TestClass& orig) {
    this->contents = orig.contents;
}

TestClass::~TestClass() {
}

bool TestClass::operator ==(const TestClass& other) {
    std::cout << "COMPARING" << std::endl;
    return (contents == other.contents);
}


// Main.cpp

#include <cstdlib>
#include <iostream>

#include "TestClass.h"

using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {

    TestClass* tc = new TestClass(1);
    TestClass* tc1 = new TestClass(1);

    cout << (tc == tc1) << endl;

    return 0;
}

Итак, вопрос в том, что я сделал не так? Я извиняюсь за то, что, вероятно, очень глупая ошибка где-то, но я просто не могу ее обнаружить.

Ответы [ 2 ]

11 голосов
/ 20 августа 2010

tc == tc1 сравнивает значения указателя. Это «должно» быть *tc == *tc1, но я не понимаю, почему вы бы изначально динамически размещали.

Автоматическое (стековое) распределение является наиболее предпочтительным, только динамическое распределение, когда вам нужно, чтобы объект был независим от области видимости. (А затем отслеживайте его с помощью автоматически распределенных интеллектуальных указателей, которые будут удалять указатель, когда это необходимо.)


Кроме того, оператор должен быть const, потому что он не изменяет this:

//                                      vvvvv
bool operator==(const TestClass& other) const;

Еще лучше - бесплатная функция:

bool operator==(const TestClass& lhs, const TestClass& rhs);

Который мог бы быть другом. (Свободные функции всегда предпочтительны, плюс это позволяет 5 == tc работать.)

4 голосов
/ 20 августа 2010

Вы сравниваете указатели.Попробуйте вместо этого:

cout << (*tc == *tc1) << endl;

Два замечания:

  • Вы должны освободить выделенную память при удалении или использовать умный указатель
  • Вы должны объявитьоператор == const :

    bool operator==(const TestClass& other) const

...