2017-06-14 126 views
1

假設我有2個模板類,每個模板類都有一個指向另一個的指針;模板類可以指向另一個的實例嗎?

template <typename T> 
class A; 

template <typename T> 
class B; 

template <typename T> 
class A 
{ 
    B<A>* p; 
}; 

template <typename T> 
class B 
{ 
    A<B>* p; 
}; 

我該如何實例化這些類?我不能簡單地運行A<B>,因爲B不是一種類型(它是一種模板類型)。

AB的實例在單獨的線程中運行,並承載相當多的狀態和功能,因此將它們彼此繼承並在每個類中複製其功能並不是一種可行的選擇。

我該如何解決這個問題,並讓這些類型相互指針/引用?

+1

我不明白這個問題。 'A x'工作正常。 – melpomene

+1

我真的好奇在什麼情況下這樣的設計是可取的 – user1620443

+0

請注意,您已注入名稱,所以您的會員實際上是'B > * p;'和'A > * p;' – Jarod42

回答

1

我該如何解決這個問題,並讓這些類型保持彼此的指針/引用?

這很乏味,但你可以做到。

template <typename T> 
struct A; 

template <typename T> 
struct B; 

template <typename T> 
struct A 
{ 
    A() : p(nullptr) {} 
    A(B<A>* ptr) : p(ptr) {} 
    B<A>* p; 
}; 

template <typename T> 
struct B 
{ 
    B() : p(nullptr) {} 
    B(A<B>* ptr) : p(ptr) {} 
    A<B>* p; 
}; 

int main() 
{ 
    A<B<int>>* a2Ptr = new A<B<int>>(); 
    B<A<int>>* b2Ptr = new B<A<int>>(); 

    A<int>* a1Ptr = new A<int>(b2Ptr); 
    B<int>* b1Ptr = new B<int>(a2Ptr); 
} 

您可以構建嵌套多個水平,但對嵌套的最深層次的對象必須有一個nullptr成員變量。

int main() 
{ 
    // This is conceptual, pseudo code, not compilable code 
    // with N levels of nesting. 
    // Member variable p is nullptr 
    A<B< ...A<int>> ...>* aNPtr = new A<B< ...A<int>> ...>(); 
    B<A< ...B<int>> ...>* bNPtr = new B<A< ...B<int>> ...>(); 

    // This is conceptual, pseudo code, not compilable code 
    // with N-1 levels of nesting. 
    // Member variable p is non-nullptr 
    A<B< ...A<int>> ...>* aMPtr = new A<B< ...A<int>> ...>(bNPtr); 
    B<A< ...B<int>> ...>* bMPtr = new B<A< ...B<int>> ...>(aNPtr); 

    A<B<A<int>>>* a3Ptr = new A<B<A<int>>>(b4Ptr); 
    B<A<B<int>>>* b3Ptr = new B<A<B<int>>>(a4Ptr); 

    A<B<int>>* a2Ptr = new A<B<int>>(b3Ptr); 
    B<A<int>>* b2Ptr = new B<A<int>>(a3Ptr); 

    A<int>* a1Ptr = new A<int>(b2Ptr); 
    B<int>* b1Ptr = new B<int>(a2Ptr); 
} 
相關問題