【问题标题】:Can template classes point to instances of one another?模板类可以指向彼此的实例吗?
【发布时间】:2017-06-14 12:02:04
【问题描述】:

假设我有 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&lt;B&gt;,因为B 不是类型(它是模板类型)。

AB 的实例在不同的线程中运行,并带有相当多的状态和功能,因此从彼此继承它们并在每个类中复制它们的功能是不可行的选择。

我怎样才能解决这个问题并让这些类型相互持有指针/引用?

【问题讨论】:

  • 我不明白这个问题。 A&lt;int&gt; x 工作正常。
  • 我真的很好奇在什么情况下这样的设计是可取的
  • 注意你已经注入了名字,所以你的成员实际上是B&lt;A&lt;T&gt;&gt;* p;A&lt;B&lt;T&gt;&gt;* p;
  • 据观察,“模板类”是一个坏名字,准确地说,因为它会引起这样的误解。 AB类模板。这意味着它们是可以实例化以创建类的模板,但它们本身不是类。 A&lt;int&gt; 就是这样一个类模板的实例化,因此是一个类。
  • @user1620443 我认为这样的设计是不言而喻的,它只是一系列不幸事件的结果。

标签: c++


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多