@toster_bodnar

Как исправить ошибку «invalid use of incomplete type»?

Как правильно выстроить определения данных классов, чтобы программа компилировалась? Или с такой архитектурой классов это невозможно?

Мой код
#include <iostream>
#include <vector>
#include <memory>

class M;
class A
{
    public:
        A() = default;

        void func()
        {
            auto d = m.getD();
            d->func();
        }

    private:
        M m;
};

class S
{
    public:
        S() = default;
        void func(M &m)
        {
            auto d = m.getD();
            d->func();
        }
};

class D
{
    public:
        D() = default;

        void func()
        {
            std::cout << "d\n";
        }

    private:
        std::vector<std::shared_ptr<S>> s;
};

class M
{
    public:
        M() = default;
        D* getD()
        {
            return &d;
        }

    private:
        D d;
};

int main()
{
    A *a = new A();
    delete a;
    return 0;
}
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
В данном случае можно так
#include <iostream>
#include <vector>
#include <memory>

class S;
class D
{
    public:
        D() = default;

        void func()
        {
            std::cout << "d\n";
        }

    private:
        std::vector<std::shared_ptr<S>> s;
};


class M
{
    public:
        M() = default;
        D* getD()
        {
            return &d;
        }

    private:
        D d;
};

class A
{
    public:
        A() = default;

        void func()
        {
            auto d = m.getD();
            d->func();
        }

    private:
        M m;
};

class S
{
    public:
        S() = default;
        void func(M &m)
        {
            auto d = m.getD();
            d->func();
        }
};


int main()
{
    A *a = new A();
    delete a;
    return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
как правильно выстроить определения данных классов, что бы программа компилировалась?

Перенести определения классов A и S после определения класса M, добавить объявление класса S перед определением класса D.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы