Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Операция приведения типов С++

#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; }

Комментариев нет:

Отправить комментарий