C ++ шаблоны вопрос - PullRequest
       1

C ++ шаблоны вопрос

0 голосов
/ 22 апреля 2011
template <class T>
class ListNode {

public:
    T* data;
        ListNode<T>* next;
}

Допустим, у меня есть шаблон узла списка и где-то в коде я хочу получить копию данных - то есть не копию указателя на данные (T *), а новый указатель (T *)), который будет указывать на другое место в памяти, где хранится та же информация.

Как это сделать при использовании шаблонов C ++?Как я могу скопировать (* данные), если я не знаю, какой тип T.

Ответы [ 4 ]

1 голос
/ 22 апреля 2011

Компилятору известен тип T . То, что не знает, это то, сколько экземпляров T указано. С точки зрения практической реализации, короткий ответ будет не использовать типы указателей. Вместо этого используйте контейнеры. Так как вы все равно копируете данные узла, накладные расходы минимальны. Явный пример ниже:

template <class T>
class ListNode {
public:
    // use a vector as the  container
    std::vector<T> data;
    ListNode<T>* next;
    // initializer from pointer primitive
    ListNode(const T* ps,size_t elements)
    {
        data.assign(ps,ps+elements);
    }
    // copy templated instance
    ListNode(const ListNode& arg)
    {
        data = arg.data;
    }
    // assignment
    ListNode& operator=(const ListNode& arg)
    {
        if (this != &arg)
        {
            data = arg.data;
        }
        return *this;
    }
};

Фактическое использование будет примерно таким:

{
    const char* ps = "Hello World";
    ListNode<char> ln1(ps,strlen(ps));
    ListNode<char> ln2 = ln1;
}

Конечно, вы можете получить гораздо более сложные решения, но все они будут включать отслеживание количества экземпляров типа T , на которые указывает ваш указатель.

0 голосов
/ 22 апреля 2011

Используйте оператор = или конструктор копирования. Это стандартная практика, что оба они будут создавать копию объекта.

Так, например:

T *p = other_pointer;
*p = *data;

Или

T* copy = new T(*data);
0 голосов
/ 22 апреля 2011

При создании копии шаблонного типа практически вам не нужно беспокоиться о типе как таковом, и выполняйте эту задачу в конструкторе копирования или операторе присваивания этого типа:

template <class T>
class ListNode {
public:
    T* data;
    ListNode<T>* next;
    T* getCopy() { new T(*data); } // get copy of "data"
};

Предположим, вы используете этоListNode<T> для class A, тогда у вас может быть определен конструктор копирования для A (и оператора присваивания):

class A {
public:
  A(const A& copy);
};

Теперь, когда вызывается ListNode<T>::getCopy(), он вызывает конструктор копированияВнутренне.

0 голосов
/ 22 апреля 2011

T должен быть копируемым, чтобы вы могли сделать

   template <class T>
   ListNode<T>::ListNode(const ListNode<T>& src)
   {

        ...
        // given a preexisting copy, src, create a new T to
        // perform a copy
        T* destT = new T(*srcT);
   }

Если T имеет конструктор копирования, это будет работать. Если этого не произойдет, компилятор выдаст вам ошибку (возможно, очень загадочную)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...