假设我有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的实例在单独的线程中运行,并具有可观的状态和功能,因此彼此继承并在每个类中复制其功能不是可行的选择。

如何解决此问题并使这些类型彼此保持指针/引用?

最佳答案



这很乏味,但是您可以做到。

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/

10-08 22:50