Вы должны использовать цикл in-in
. Но будьте очень осторожны при использовании этого типа цикла, потому что это зациклирует все свойства вдоль цепи прототипа.
Поэтому , при использовании for-in циклов всегда используйте метод hasOwnProperty
, чтобы определить, действительно ли текущее свойство в итерации является свойством объекта, который вы проверяете:
for (var prop in p) {
if (!p.hasOwnProperty(prop)) {
//The current property is not a direct property of p
continue;
}
//Do your logic with the property here
}
Вы не можете сделать чего-то вроде этого:
class A {
B b;
};
class B {
A a;
};
Самой очевидной проблемой является компилятор, не знает, как к большому это должно сделать класс A, потому что размер B зависит от размера A!
Можно, однако, сделать это:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
При объявлении класса B, поскольку предописание позволяет Вам использовать указатели (и ссылки) к тому классу, еще не имея целого определения класса.
Вы не можете объявить экземпляр неопределенного класса, но можно объявить указатель на один:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Существует изящное использование решения шаблоны.
template< int T > class BaseTemplate {}; typedef BaseTemplate< 0 > A; typedef BaseTemplate< 1 > B; // A template<> class BaseTemplate< 0 > { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate< 1 > { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Этот код будет работать! Так, почему это работает? Причина имеет отношение, как компилируются шаблоны. Шаблоны задерживают создание функциональных подписей, пока Вы на самом деле не используете шаблон где-нибудь. Это означает, что никакой гете (), ни getB () не проанализируют их подписи до окончания обоих классов A, и B были уже полностью объявлены. Это - волшебство этого метода.
Это близко к тому, что Вы хотите: первый класс содержит второй класс, но второй класс (который должен быть создан сначала) просто имеет ссылку на первый класс?
Это называют перекрестной ссылкой. Посмотрите здесь пример.