2010-06-28 2 views
0

Скажем, у меня есть два класса:C++ каждый класс зависит от второго

class One { 
    Two *somevar = new Two; 
    // (...) 
}; 

class Two { 
    One *somevar = new One; 
    // (...) 
} 

И это невозможно собрать что-то подобное. Как с этим справиться?

+2

@bta имеет правильный ответ - все, что вам нужно, это опережающее объявление. Однако такое «взаимное объятие» всегда является запахом кода для меня. Я не говорю, что никогда не бывает случаев, когда это правильно, но я говорю, что, по моему личному опыту, всякий раз, когда я сталкиваюсь с такой ситуацией, это означает, что я не тщательно продумал свою классовую структуру. Перестраивая классы, проблема обычно уходит. Вы считали, что то, что у вас есть, не проблема с кодированием, а проблема дизайна? – Mawg

ответ

9

Поскольку все, что вы вложенности является указателем, попробуйте:

class Two; 

class One { 
    Two *somevar = new Two; 
    // (...) 
}; 

class Two { 
    One *somevar = new One; 
    // (...) 
} 

По вперед объявляя класс Two, вы даете компилятор достаточно информации, чтобы быть в состоянии создать указатель внутри класса One. Если вы пытались вложить сами классы, а не только указатели, тогда не было бы никакого способа решить проблему.

+1

+1. Также в этом псевдокоде инициализация someVar должна выполняться в файле cpp, включая соответствующие заголовки, чтобы было доступно полное определение класса (требуется для оператора new). – stinky472

+0

@ stinky472- отличная точка, спасибо – bta

+0

@ stinky472, @bta, это можно сделать только для заголовков, но вам нужно будет выполнить инициализацию в конструкторе, определенном извне из объявления. Конструктор (убедитесь, что вы пометили его inline) для 'One' должен был возникнуть после определения' Two. –

0

Я думаю, я нашел решение:

// class Type instead of Type 
// so: 
class Two *somevar = new class Two;