将模板类的对象传递给另一个类

时间:2016-10-25 12:22:19

标签: c++ class templates

我有一个模板类,

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

现在我需要有一个接收类A的对象作为构造函数参数的类B,并将它分配给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< int > int_buffer(20);一样初始化,并且在不同的类中使用相同的int_buffer,比如B和C(生产者和消费者) )。这是实现我的目标的正确方法还是你可以建议的任何更好的方法。

2 个答案:

答案 0 :(得分:2)

您只需要将B作为模板:

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

这解决了共享指针的问题。如果B<T>依赖于外部拥有的A<T>*,或A<T>*的所有权也被转移到B<T>,那么作为读者,我不清楚}。 C ++ 11为您提供了一些分享指针的好工具,我强烈建议您利用它们。

如果您要共享A<T>*但是它将在外部拥有,请使用shared_ptr 如果您在构建时转让A<T>*的所有权,请使用unique_ptr表示。

修改

B<T>包含成员对象A<T>。但它由指针控制。 通过指针或引用持有成员表示对象使用是共享的,或者所有权是外部的。

如果不了解您的设计,很难提出一个好的设计原则,所以我在这里给出一些可选的情况,建议你坚持一个符合你情况的那个:

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

答案 1 :(得分:0)

你的问题不明确。你想完成这个吗?

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