C++ 将模板类的对象传递给另一个类的构造函数

C++ 将模板类的对象传递给另一个类的构造函数,c++,class,templates,C++,Class,Templates,我有一个模板类 template< typename T > class A { private: T *array; public: A(int size) { //Initialises array with size } } 模板 甲级 { 私人: T*阵列; 公众: A(整数大小) { //使用大小初始化数组 } } 现在我需要一个类B,它接收类a的对象作为构造函数参数,并将其分配给引用的B本地成员。我该怎么做?我试过

我有一个模板类

template< typename T >
class A
{
private:
    T *array;
public:
    A(int size)
    {
         //Initialises array with size 
    }
}
模板
甲级
{
私人:
T*阵列;
公众:
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
  }
}
B类
{
私人:
模板
A*A;
公众:
模板
B(A(int)ar){
//将ar分配给
}
}
有人能帮我解决这个问题吗

更新
实际上,我想在这里实现的是,认为类A是一个通用的循环缓冲区,它可以像
Aint\u缓冲区(20)那样一次性初始化和相同的int_缓冲区,用于不同的类,如B和C(生产者和消费者)。这是实现我的目标的正确方法还是您可以建议的更好的方法。

您只需将
B
作为模板:

template <typename T>
class B {
    A<T>* a;
public:
    B(A<T>* ar) : a(ar) {}
};
模板
B类{
A*A;
公众:
B(A*ar):A(ar){}
};
这涉及到共享指针的问题。作为读者,我不清楚
B
是否依赖于外部拥有的
A*
,或者
A*
的所有权是否也转移到
B
。C++11为您提供了一些共享指针的好工具,我强烈建议您利用它们

如果您想共享
A*
,但它将由外部拥有,请使用。
如果您在施工时转让了
A*
的所有权,请使用

编辑:

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

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

  • 如果
    B
    A
    成员仅在单个
    B
    对象中使用,则需要在
    B
    的构造函数或构造的放置空间中创建该成员
  • 如果
    B
    A
    成员在所有
    B
    之间共享,则它应该是
    B
    类的静态成员
  • 如果
    A
    将归
    B
    所有,但只能由指针接收,请使用
    唯一\u ptr
    而不是
    A*
    作为成员类型
  • 如果
    A
    将在外部共享,并且只要至少保留一个对其的引用,就不会被删除,请使用
    shared\u ptr
    而不是
    A*
    作为成员类型
  • 如果
    A
    为外部所有,并且可能或可能未被销毁,则使用
    weak_ptr
    而不是
    A*
    作为成员类型

  • 你的问题不清楚。你想做到这一点吗

    class B
    {
    private:
      A<int> *a;
    public:
      B(A<int> ar){
         //assign ar to a
      }
    };
    
    B类
    {
    私人:
    A*A;
    公众:
    B(A ar){
    //将ar分配给
    }
    };
    
    您不能有模板成员变量。要实现您想要的,您需要一种形式的。在
    B(a(int)ar)
    中的
    (int)
    也是可疑的。正确。模板不是对象,是吗@故事讲述者感谢您的回复。您是否有类似问题的解决方案示例?为什么不将
    B
    作为模板?不,类型可能不总是int,a中的int是构造函数的参数,它实际上是要创建的“数组”的大小。您能否更好地解释
    B(a(int)ar)
    ?这让我们很困惑。想要在B构造函数中接收A的对象,这就是我在这里的意思。
    (int)
    的目的是什么?你能详细说明一下你在回答中提到的共享问题吗?你可以参考我在这个问题中所做的更新来理解我的需求。@尼克希奥古斯汀,我尝试提供一些关于C++智能指针用法的启发。最好的建议是消除指针使用并最小化智能指针使用。无论如何,我们已经远远超出了原始问题的意图,因此如果您仍然感到困惑,我将首先扫描我链接的智能指针文档。如果你还有更多关于用法的问题,请打开一个新问题并在这里的评论中粘贴一个链接,我会来尝试回答。谢谢@Jonathan Mee