C++ Почему не работает предварительное объявление класса?

288
01 июля 2017, 11:29
//=========================================================================
class CPU;
class Memory;
class IOdevice;
class Motherboard
{
    string name;
protected:
    Memory mem;
    CPU cpu;
    IOdevice io;
public:
    Motherboard();
};
Motherboard::Motherboard()
{
    name = "Системная плата/шина данных";
    cpu = CPU();
    mem = Memory();
    io = IOdevice();
}
//=========================================================================
class CPU  : public Motherboard
{
    string name;
public:
    CPU();
};
CPU::CPU()
{
    name = "Центральный процессор";
}
//=========================================================================
class Memory  : public Motherboard
{
    string name;
    //хранящиеся данные
    string login;
    string password;
public:
    Memory();
};
Memory::Memory()
{
    name = "Память";
    login = "";
    password = "";
}
//=========================================================================
class  IOdevice : public Motherboard
{
    string name;
public:
    IOdevice();
};
IOdevice::IOdevice()
{
    name = "Устройство ввода/вывода";
}
//=========================================================================

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
 }

Мне главное чтобы я мог из любого класса связаться с объектом любого другого класса (для этого я делаю наследование). Но запутался как правильно построить иерархию. Что должно идти за чем? И почему не работает предварительно объявление классов? Как решить проблему скажите пожалуйста?

Answer 1

Если внутри класса Вы пишете вот так

Memory mem;

то компилятору нужно знать размер класса Memory в этом месте. Если он имеет только предварительное определение, то он этого сделать не может. Поэтому, нужно либо через указатель

Memory *mem;

либо через умный указатель

std::unique_ptr<Memory> mem;

Либо расставить определения классов правильно (тогда не нужно будет предварительное определение), но это возможно только в том случае, если у Ваших классов нет циклицеских зависимостей.

Answer 2

какой-то станный дизайн класса - почему наследуется память от материнки ? процессор от материнки ? и т.д. - как может память или процессор или устройство ввода вывода являться материнской платой ? отношение is a здесь не подходит вобще, вам нужно has a,

Тоесть я бы сперва дизайн поменял - убрал бы насследование вообще, а в классе MotherBoard аггрегировал бы все остальное, тоесть сделал бы память, процессор, устройство ввода вывода члены класса MotherBoard - а тогда думаю уже и проблем с forward declaration не будет

READ ALSO
Как сделать, чтобы открытое миобильное slidemenu можно было скроллить?

Как сделать, чтобы открытое миобильное slidemenu можно было скроллить?

Добрый вечер, столкнулся с проблемойПытаюсь сделать, чтобы в мобильной версии страницы, при открытом slidemenu скроллилось оно, а не содержимое...

260
Вывод данных json полученых ajax&#39;ом

Вывод данных json полученых ajax'ом

День добрыйЕсть небольшой скриптик который с помощью ajax-запроса получает данные посредством api

224
Фон только под текстом

Фон только под текстом

Как сделать фон именно под текстом, не покрывая пространство между строк

351
На какой технологии написан этот сайт? [требует правки]

На какой технологии написан этот сайт? [требует правки]

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

257