c++ - 模板类可以指向彼此的实例吗?

标签 c++

假设我有 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/

相关文章:

java - 用 C++ 或 Java 在屏幕上绘制叠加层

c++ - 是否有 std::function 的独立实现?

C++,忽略异常并继续代码?

c++ - 二维数组和坐标

c++ - 带有指向对象初始化的指针的数组

c++ - 数组作为函数参数查找数组长度时出错

c++ - 打破 GLSL 着色器指令限制的错误消息是什么?

c++ - C++ 虚拟继承是如何在编译器中实现的?

c++ - 使用 boost::asio 发送 Protobuf 消息

c++ - 在 C/C++ 中使用堆栈进行内存管理时的编码风格