#cpp #function_overloading
Есть два класса A и B как реализовать приведение типов друг в друга? class A { ... operator B() { return B(5); } }; class B { ... operator A() { return A(5); } }; Пробовал писать объявление до определения, не помогает.
Ответы
Ответ 1
В C++ разрешение зависимостей определений классов устроено следующим образом: Если в некотором месте кода встречается имя класса, то к этому моменту этот класс уже должен быть определён. Есть два варианта определения класса: class A; class A { ... } Определять класс первым способом можно сколько угодно раз, вторым способом только один раз. Второй тип определения более сильный, так как второй тип определения фиксирует структуру класса. В определении второго типа можно опустить реализацию некоторых методов, и написать их позже (считается хорошей практикой писать определение класса в .h файле, а реализацию в соответствующем .cpp файле). Вот хорошая статья на эту тему. Таким образом, решение может выглядеть следующим образом: class A; class B; class A { public: operator B(); }; class B { public: operator A(); }; A::operator B() { return B(); } B::operator A() { return A(); } int main() { A a; B b = (B) a; A a2 = (A) b; return 0; }Ответ 2
Один класс (выберите по своему вкусу :)) вынести в предварительное объявление, а его использование - после определения класса: class B; class A { public: operator B() const; }; class B { public: operator A() const { cout << "B::A()\n"; return A(); } }; inline A::operator B() const { cout << "A::B()\n"; return B(); } int main() { A a; B b; a = b; b = a; }
Комментариев нет:
Отправить комментарий