2017-06-14 63 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); 
} 
相关问题