оператор преобразования с прямым объявлением

0

Я пытаюсь работать с операторами преобразования в c++ У меня есть 2 класса, которые я пытаюсь преобразовать из одного в другой, и я получаю ошибки:

class Cow; //error: forward declaration of 'struct Cow'

class Horse {
public:
    Horse():i(0){}
    Horse(int i):i(i){}
    operator Cow() const { return Cow(i); } // error: invalid use of incomplete type 'struct Cow'
                                            //error : return type 'struct Cow' is incomplete

private:
    int i;
};

class Cow{
public:
    Cow():i(0){}
    Cow(int i):i(i){}
    operator Horse() const { return Horse(i); }
private:
    int i;
};

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

  • 3
    Определите функции вне классов после завершения обоих определений классов.
  • 1
    Для пояснения проблема не в том, что вы возвращаете Cow, типы возвращаемых значений не нужно определять в объявлениях функций. проблема в том, что у вас есть определение функции (включая выделение места для Cow, конструктор Cow (i), конструктор копирования / перемещения (если не исключен)), все из которых еще не объявлены.
Показать ещё 2 комментария
Теги:
operators
overloading
conversion-operator

1 ответ

1
Лучший ответ

Попробуй это:

class Cow;

class Horse {
public:
    Horse():i(0){}
    Horse(int i):i(i){}
    operator Cow() const;                     
private:
    int i;
};

class Cow{
public:
    Cow():i(0){}
    Cow(int i):i(i){}
    operator Horse() const;
private:
    int i;
};

Horse::operator Cow() const { return Cow(i); }                                      
Cow::operator Horse() const { return Horse(i); }
  • 0
    Это замечательно, однако я заметил, что мне нужно применить это решение только для Horse, оператор в Cow работает как обычно.
  • 0
    Да, он нужен только для самого верхнего класса, который ссылается на тот, который находится под ним.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню