шаблоны — c ++ конструктор по умолчанию вызывается в параметризованном конструкторе?

У меня есть следующий шаблон класса:

template<typename T, int nSize> class Stack{
private:
int m_nCurrentPos;
Array<T> m_tArray;
public:
Stack(int nCurrentPos = 0);
...
};

Я хотел бы, чтобы конструктор по умолчанию работал следующим образом:

template<typename T, int nSize> Stack<T,nSize>::Stack(int nCurrent){
m_nCurrent = nCurrentPos;
m_tArray = Array<T>::Array(nSize);
};

Где Array выглядит так:

template <typename T> class Array{
private:
T* m_cData;
int m_nSize;
static int s_nDefaultSize;
public:
Array();
Array(int nSize);
...
};

И его конструкторы:

template<typename T> Array<T>::Array(){
m_nSize = s_nDefaultSize;
m_cData = new T[m_nSize];
}

и, очевидно,

template<typename T> Array<T>::Array(int nSize){
m_nSize = nSize;
m_cData = new T[m_nSize];
}

Итак, Stack состоит из Array и некоторых дополнительных функций. Моя проблема что когда в массиве я определяю s_nDefaultSize быть скажем 512и я пытаюсь создать экземпляр Stack<int,1024> Я получаю исключение из класса Array, говоря, что я пытаюсь назначить два массива разной длины. Как только я изменю код так, что s_nDefaultSize=1024 (поэтому он соответствует нетиповому аргументу шаблона nSize), все в порядке. Итак, другими словами, исключение происходит, как только s_nDefaultSize != nSize, Итак, я думаю, что в коде выше, в конструкторе по умолчанию Stack<T,nSize>то есть m_tArray = Array<T>::Array(nSize); m_tArray создается по умолчанию конструктором массива (используя s_nDefaultSize) и только потом компилятор пытается присвоить его Array<T>::Array(nSize) (используя мой nSize значение). Это верно? И если да, как я могу изменить это поведение? Это еще один вопрос, который я опубликовал вчера, который, хотя и касается наследования, а не композиции, очень сильно связан с вопросом в этой теме. Ура!

0

Решение

Вам нужно использовать список инициализации члена с конструктором Stack:

template<typename T, int nSize>
Stack<T,nSize>::Stack(int nCurrent)
: m_tArray(nSize)
{
m_nCurrent = nCurrentPos;
};

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector