假设我有 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
不是类型(它是模板类型)。
A
的实例和 B
在单独的线程中运行并携带相当多的状态和功能,因此相互继承它们并在每个类中复制它们的功能不是一个可行的选择。
如何解决这个问题并让这些类型相互保存指针/引用?
最佳答案
How can I solve this problem and have these types hold pointers/references to each other?
这很乏味,但你可以做到。
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);
}
关于c++ - 模板类可以指向彼此的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534742/