【问题标题】:Passing object of a template class to constructor of another class将模板类的对象传递给另一个类的构造函数
【发布时间】:2017-03-07 11:55:50
【问题描述】:

我有一个模板类,

template< typename T >
class A
{
private:
    T *array;
public:
    A(int size)
    {
         //Initialises array with size 
    }
}

现在我需要一个 B 类,它接收 A 类的对象作为构造函数参数并将其分配给 A 引用的 B 本地成员。我怎么做?我试过了,

class B
{
private:
  template<class T>
  A<T> *a;
public:
  template<class T>
  B(A<T>(int) ar){
     //assign ar to a
  }
}

谁能帮我解决这个问题?

更新 实际上我想在这里实现的是,认为 A 类是一个通用的循环缓冲区,可以像A&lt; int &gt; int_buffer(20); 一样一次性初始化它,并且在不同的类中使用相同的 int_buffer,比如 B 和 C(生产者和消费者)。这是实现我的目标的正确方法还是您可以建议的任何更好的方法。

【问题讨论】:

  • 您不能有模板成员变量。要完成您想要的,您需要type erasure 的形式。
  • B(A&lt;T&gt;(int) ar) 中的 (int) 也是可疑的。
  • 正确。模板不是对象。
  • 哦是吗? @StoryTeller 感谢您的回复。您有类似问题的解决方案示例吗?
  • 为什么不将B 设为模板?

标签: c++ class templates


【解决方案1】:

您只需要将B 也设为模板:

template <typename T>
class B {
    A<T>* a;
public:
    B(A<T>* ar) : a(ar) {}
};

这运行在共享指针的问题上。作为读者,我不清楚B&lt;T&gt; 是否将依赖于外部拥有的A&lt;T&gt;*,或者A&lt;T&gt;* 的所有权是否也转移到B&lt;T&gt;。 C++11 为您提供了一些很好的共享指针的工具,我强烈建议您利用它们。

如果您想分享A&lt;T&gt;*,但它将被外部拥有,请使用shared_ptr
如果您在施工时转让A&lt;T&gt;* 的所有权,请使用unique_ptr 表示。

编辑:

B&lt;T&gt; 包含一个成员对象A&lt;T&gt;。但它是由指针持有的。 通过指针或引用持有成员表示使用的对象是共享的或所有权是外部的。

在不了解您的设计的情况下,很难提出一个好的设计原则,因此我将在此处提供一些可选情况,并建议您遵守与您的情况相匹配的情况:

  1. 如果B&lt;T&gt;A&lt;T&gt; 成员仅在单个B&lt;T&gt; 对象中使用,则该成员需要在B&lt;T&gt; 的构造函数或emplace 构造中创建
  2. 如果B&lt;T&gt;A&lt;T&gt; 成员在所有 B&lt;T&gt; 之间共享,它应该是B 类的静态成员
  3. 如果A&lt;T&gt; 将归B&lt;T&gt; 所有但只能通过指针接收,则使用unique_ptr&lt;A&lt;T&gt;&gt; 而不是A&lt;T&gt;* 作为成员类型
  4. 如果A&lt;T&gt; 将在外部共享且不会被删除,只要至少保留一个对其的引用,请使用shared_ptr&lt;A&lt;T&gt;&gt; 而不是A&lt;T&gt;* 作为成员类型
  5. 如果A&lt;T&gt; 为外部所有且可能已被销毁,也可能未销毁,则使用weak_ptr&lt;A&lt;T&gt;&gt; 而不是A&lt;T&gt;* 作为成员类型

【讨论】:

  • 您能否详细说明您在答案中提到的 shared_ptr 问题?您可以参考我在问题中所做的更新以了解我的要求。
  • @NikhilAugustine 我试图提供一些关于 C++ 智能指针使用的启发式方法。最好的建议是消除指针的使用并尽量减少智能指针的使用。无论如何,我们远远超出了原始问题的意图,所以如果你仍然感到困惑,我会先扫描我链接的智能指针文档。如果您对使用有其他疑问,请在此处打开一个新问题并将链接粘贴到评论中,我会来尝试回答。
  • 谢谢@Jonathan Mee
【解决方案2】:

你的问题不清楚。你想完成这个吗?

class B
{
private:
  A<int> *a;
public:
  B(A<int> ar){
     //assign ar to a
  }
};

【讨论】:

  • 不,类型可能并不总是 int,A 中的 int 是构造函数的参数,它实际上是要创建的“数组”的大小。
  • 你能更好地解释一下B(A&lt;T&gt;(int) ar) 的意思吗?这让我们很困惑。
  • 想在 B 构造函数中接收 A 的对象,这就是我的意思。
  • (int)的目的是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多