2016-10-25 3 views
0

У меня есть класс шаблона,Передача объекта класса шаблона в конструктор другого класса

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

Теперь мне нужно иметь класс B, который принимает объект класса А в качестве аргумента конструктора и присваивает его B местными член ссылки. Как мне это сделать? Я пробовал, как,

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

Может ли кто-нибудь помочь мне решить эту проблему?

UPDATE На самом деле то, что я хочу добиться здесь есть, думаю, что класс А общий кольцевой буфер, который может быть инициализирован в одном кадре, как A<int> int_buffer(20); и тот же int_buffer для использования в различных классах говорят B и C (Продюсер и Потребитель). Является ли это правильным способом достижения моей цели или любого лучшего подхода, который вы можете предложить.

+0

У вас нет переменной-члена шаблона. Чтобы выполнить то, что вы хотите, вам понадобится форма [erasure type] (https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Erasure). – StoryTeller

+2

'' (int) 'in' B (A (int) ar) 'также является подозрительным. – MSalters

+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. If B<T> ' с A<T> элемент используется только в пределах одного B<T> объекта, этот член должен быть создан в рамках B<T> «конструктора с или устанавливать построены
  2. Если 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>* в качестве типа члена
+0

Не могли бы вы подробнее рассказать о проблеме shared_ptr, о которой вы упомянули в ответе? Вы можете сослаться на обновление, которое я сделал в вопросе, чтобы понять мои Требование –

+1

@NikhilAugustine Я попытался предоставить некоторые эвристики в использовании умного указателя на C++. Лучшим советом является устранение использования указателя и минимизация использования интеллектуальных указателей. В любом случае мы довольно далеко не в соответствии с исходным вопросом, поэтому, если вы Я все еще запутался, я начал с сканирования документации интеллектуального указателя, которая Я связался. Оттуда, если у вас появятся дополнительные вопросы об использовании, откройте новый вопрос и вставьте ссылку в комментарий здесь, и я попытаюсь ответить на него. –

+0

Спасибо @Jonathan Mee –

0

Ваш вопрос непонятен. Вы хотите это сделать?

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

Нет, тип не может быть int всегда, int in A - это аргумент конструктору, который на самом деле определяет размер создаваемого массива. –

+0

Можете ли вы лучше объяснить, что вы подразумеваете под 'B (A (int) ar)'? Это нас путает. – jimifiki

+0

хочу получить объект A в B-конструкторе, вот что я имею в виду здесь. –

Смежные вопросы