Объявите объект даже, прежде чем тот класс будет создан

Вы должны использовать цикл 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
}
8
задан Coding Mash 9 September 2012 в 16:20
поделиться

5 ответов

Вы не можете сделать чего-то вроде этого:

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, поскольку предописание позволяет Вам использовать указатели (и ссылки) к тому классу, еще не имея целого определения класса.

39
ответ дан 5 December 2019 в 04:38
поделиться

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

class A;  // Declare that we have a class A without defining it yet.

class B
{
public:
    A *itemA;
};

class A
{
public:
    B *itemB;
};
5
ответ дан 5 December 2019 в 04:38
поделиться

Существует изящное использование решения шаблоны.

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 были уже полностью объявлены. Это - волшебство этого метода.

2
ответ дан 5 December 2019 в 04:38
поделиться

Это близко к тому, что Вы хотите: первый класс содержит второй класс, но второй класс (который должен быть создан сначала) просто имеет ссылку на первый класс?

0
ответ дан 5 December 2019 в 04:38
поделиться

Это называют перекрестной ссылкой. Посмотрите здесь пример.

0
ответ дан 5 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: