перегрузка оператора - PullRequest
       26

перегрузка оператора

1 голос
/ 04 сентября 2010

Я создал класс myString и пытаюсь запустить следующий код:

class myString{
    char* str;
    int len;

public:
    myString(char* str1 = " "){
        len = strlen(str1);
        str = new char[len+1];
        strcpy(str, str1);
    };

    int getLen() const {
        return len;
    };

    char* getString() const {
        return str;
    };

    ~myString(){
        delete[] str;
    };

    myString& operator=(myString& orig){
        cout << "hello";
        if (str == NULL){
            delete[] str;
        };
        str = new char[orig.getLen()];
        strcpy(str, orig.getString());
        cout << this << endl;
        return *this;
    };

    ...
};



int main(){


    myString s("bla");
    myString k("dingo");
        myString g = s;
        // s=k;  //When this line is commented I get a linking error
         ...
   };

Мои вопросы:

  1. Почему «привет» не печатается?
  2. Почему строка s=k вызывает ошибку компоновщика?

Это ошибка:

ССЫЛКА: c: \ users \ perry \ documents\ visual studio 2010 \ Projects \ inheritance \ Debug \ inheritance.exe не найден или не создан по последней добавочной ссылке;выполнение полной ссылки 1> main.obj: ошибка LNK2019: неразрешенный внешний символ "class std :: basic_ostream> & оператор __cdecl << (класс std :: basic_ostream </p>

&, класс myString *)" (6 @ YAAAV? $ Basic_ostream @ DU? $ Char_traits @ D @ std @@@ std @@ AAV01 @ PAVmyString @@@ Z) ссылка на функцию "public: class myString & __thiscall myString :: operator = (класс myString &) "(?? 4myString @@ QAEAAV0 @ AAV0 @@ Z) 1> c: \ users \ perry \ documents \ visual studio 2010 \ Проекты \ наследование \ Debug \ inheritance.exe: фатальная ошибка LNK1120: 1 неразрешенная внешняя часть

Спасибо, Ли

Ответы [ 5 ]

3 голосов
/ 04 сентября 2010

Для следующего вам нужен конструктор копирования.Он не использует функцию оператора присваивания.

myString g = s;

Редактировать

Для ошибки компоновщика - я не могу вам с этим помочьВместо того, чтобы угадывать, что operator<< вызывает эта строка, я просто откажусь от этого, потому что вы не предоставили код.В обычном коде C ++ нет способа, которым простой cout << this; мог бы вызвать ошибку компоновщика.cout имеет оператор, который принимает для этого void const*.Вы где-то объявили оператор, который обеспечивает лучшее соответствие, но не определили его.

1 голос
/ 04 сентября 2010

Ошибка связи: вы не определили

operator<<(class std::basic_ostream< >  &,class myString *)

из-за строки

cout << this << endl;
0 голосов
/ 04 сентября 2010

Во-первых, myString g = s; - это инициализация нового myString, и это делается с помощью конструктора копирования (который предоставляется автоматически, потому что вы его не написали).

Ошибка ссылки из-за строки cout << this << endl;, так как вы не сказали системе, как печатать this, и она, очевидно, не может найти способ.

В C ++ есть правило трех: если вы пишете конструктор копирования, оператор присваивания или деструктор, вам, вероятно, нужно написать все три. (Исключением является написание виртуального деструктора для базового класса.) Как правило, тогда ваш класс управляет каким-либо ресурсом (str в вашем случае), и вам нужно обрабатывать его во всех трех случаях.

Кроме того, используйте const, когда можете. Вы можете передать не const переменную в const ссылку, но не наоборот.

Твой деструктор в порядке. Ваш оператор присваивания должен иметь подпись myString & operator=(const &myString), а ваш конструктор копирования должен иметь подпись myString::myString(const &myString).

0 голосов
/ 04 сентября 2010
myString g = s;

Это не вызывает operator =, но конструктор копирования. Поскольку вы не определили никакого конструктора копирования, генерируется конструктор по умолчанию, копирующий все поля. Но вы держите указатели, вы не хотите, чтобы это произошло! Вот почему вам нужен конструктор копирования.

Об ошибке связывания:

cout << this << endl;

Здесь вы пытаетесь использовать operator<< с этим. Тип этого myString*, для которого этот оператор не определен. Если вы хотите напечатать значение указателя this, вы можете преобразовать его:

cout << (void*) this << endl;



 if (str == NULL){
                delete[] str;
            };

Вы хотите if (str != NULL) здесь (опечатка?).

0 голосов
/ 04 сентября 2010

Я думаю, что это должно быть

operator=(const myString &orig)
...