Неопределенная ошибка типа даже при предварительном объявлении

Я читал о циркулярных ссылках и предварительных декларациях. Я понимаю, что не очень хорошая практика проектирования — иметь реализации в заголовочном файле. Однако я экспериментировал и не мог понять это поведение.

С помощью следующего кода (содержащего предварительные объявления) я ожидал его сборки, однако я получаю эту ошибку:

Error   1   error C2027: use of undefined type 'sample_ns::sample_class2'

Header.hpp

#ifndef HEADER_HPP
#define HEADER_HPP
#include "Header2.hpp"namespace sample_ns
{
class sample_class2;
class sample_class{
public:
int getNumber()
{
return sample_class2::getNumber2();
}
};
}
#endif

Header2.hpp

#ifndef HEADER2_HPP
#define HEADER2_HPP
#include "Header.hpp"namespace sample_ns
{
class sample_class;
class sample_class2{
public:
static int getNumber2()
{
return 5;
}
};
}
#endif

Очевидно, я чего-то не хватает. Может ли кто-нибудь указать мне правильное направление относительно того, почему я получаю эту ошибку.

0

Решение

Вы можете обойтись без предварительного объявления, если у вас есть указатели или ссылки. Поскольку вы используете конкретный метод этого класса, вам нужно полное включение.

Однако с вашим текущим дизайном у вас есть круговая зависимость. Измените файл Header2, чтобы удалить "Header.hpp" и вперед объявить sample_class разрешить круговую зависимость.

#ifndef HEADER2_HPP
#define HEADER2_HPP
namespace sample_ns
{
class sample_class2{
public:
static int getNumber2()
{
return 5;
}
};
}
#endif
2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector