Учебник для начинающих C ++ плюс Глава 14 Стек без типов - PullRequest
0 голосов
/ 25 сентября 2019

почему ArrayTP<double,12> eggweights; ArrayTP<double,13> donuts; генерирует два отдельных класса, а Stack<int> eggs(12); Stack<int> dunkers(13) генерирует только одно объявление?Разве они не должны быть двумя стеками: один - яйца стека, другой - dunkers стека?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Ну, это то, что ваши декларации заявляют.

ArrayTP<double,12> eggweights;
ArrayTP<double,13> donuts;

Тип первой переменной - ArrayTP<double,12>, а типа второй - ArrayTP<double,13>.Они разные.

Stack<int> eggs(12);
Stack<int> dunkers(13);

Тип первой переменной - Stack<int>, а типа второй - Stack<int>.Это то же самое.

12 и 13 для eggs и dunkers являются параметрами для их конструкторов.Ожидать, что будут получены разные типы, это все равно, что ожидать различных типов для следующего:

std::string foo{"hello"};
std::string bar{"world"};
0 голосов
/ 25 сентября 2019

ArrayTP - это шаблонный класс, который будет иметь определение класса следующим образом:

template <typename T, size_t const Size>
class ArrayTP 
{
    private:
    T Array[Size];
    ...
    public:
    ArrayTP()
    {
    ...
    }
};

Как вы можете видеть, параметр size используется для объявления массива такого размера (в стеке здесь). eggweights будет иметь массив из 12 элементов, а donuts - массив из 13 элементов.Компилятор генерирует два разных типа из определения класса шаблона - один с размером 12, а другой с размером 13.

Stack<int> не принимает параметр размера, только тип.Тем не менее, конструктор этого класса, вероятно, имеет конструктор, который принимает целое значение для размера.Он будет иметь определение класса следующим образом:

template <typename T>
class Stack
{
    private:
    T *Array;

    public:
    Stack(size_t size)
    {
        Array = new T[size];
    }
 ...
 }

Компилятор генерирует только один тип класса, то есть Stack<int>, а размер указывается в качестве параметра конструктора.Таким образом,

Stack<int> eggs(12);
Stack<int> dunkers(13)

оба являются объектами Stack - один размером 12, а другой размером 13.

В конечном счете, разница заключается в том, что ArrayTP вы задаете размер в качестве параметра шаблона.во время компиляции с Stack вы предоставляете его как параметр конструктора во время выполнения.Первый из них будет генерировать разные типы (ArrayTP, ArrayTP и т. Д.) Из определения шаблона для разных размеров.

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