Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
1

Инициализация переменной в шаблонном классе

26.09.2015, 10:58. Показов 3248. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как правильно инициализировать шаблонную переменную в классе?
Т.е. есть ли какая разница между x() и x( T() ) ?

1-й вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T>
class MyClass
{
private:
    T  x;
    
public:
    MyClass()
        : x()
    {}
    
    void Print() const
    {
        std::cout << "x = " << x << std::endl;
    }
};
2-й вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T>
class MyClass
{
private:
    T  x;
    
public:
    MyClass()
        : x( T() )
    {}
    
    void Print() const
    {
        std::cout << "x = " << x << std::endl;
    }
}
Добавлено через 5 минут
В обоих случаях Print() печатает 0. Но все таки есть какие различия?Вот что хочу узнать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2015, 10:58
Ответы с готовыми решениями:

Инициализация статического члена std::vector в шаблонном классе
есть класс myclass , владеющий классом struct template&lt;class T&gt; class myclass { struct...

Инициализация переменной в классе
Пытаюсь инициализировать в классе переменную и дальше ее использовать class Lines { double PI =...

Инициализация переменной структуры, определенной в классе
Добрый день. Имеется такой код: #include&lt;iostream&gt; class Qwe { int cl; struct Bla {

Инициализация в производном классе переменной из базового класса
Привет подскажите пожалуйста, как правильно реализовать такое. Есть член переменная базового...

14
698 / 105 / 19
Регистрация: 22.06.2014
Сообщений: 234
26.09.2015, 11:13 2
А если вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T>
class MyClass
{
private:
    T  x;
    
public:
    MyClass(T value = {})
        : x(value)
    {}
    
    void Print() const
    {
        std::cout << "x = " << x << std::endl;
    }
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
26.09.2015, 11:15 3
В первом случае по умолчанию, во втором с параметром, но параметр получается снова через конструктор по умолчанию. Второй вариант избыточен.
1
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
26.09.2015, 13:29  [ТС] 4
Martein, это совсем другое. У меня конструктор без аргументов

Цитата Сообщение от nmcf Посмотреть сообщение
Второй вариант избыточен.
Тогда почему в std :: pair применяется избыточный вариант? Наверно не просто так

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class _Ty1,
    class _Ty2>
    struct _Pair_base
    {   // store a pair of values
    
    _Ty1 first;     // the first stored value
    _Ty2 second;    // the second stored value
 
    _Pair_base()
        : first(_Ty1()), second(_Ty2())
        {   // construct from defaults
        }
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.09.2015, 13:51 5
Лучший ответ Сообщение было отмечено IVSasha как решение

Решение

Цитата Сообщение от IVSasha Посмотреть сообщение
есть ли какая разница между x() и x( T() ) ?
с практической точки зрения - результат будет одинаковым в обоих случаях.
(компилятор оптимизирует вызов избыточного конструктора копирования/перемещения).

с технической точки зрения,
второй вариант накладывает дополнительное требование:
доступность конструктора копирования или перемещения.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.09.2015, 14:47 6
Цитата Сообщение от IVSasha Посмотреть сообщение
Тогда почему в std :: pair применяется избыточный вариант?
Уже не применяется. http://wg21.cmeerw.net/lwg/issue265
1
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
26.09.2015, 14:53 7
Tulosba, удивляюсь, как ты это раскопал.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.09.2015, 15:11 8
nmcf,
Посмотрел реализацию в GNU. Вижу комментарий
C++
1
// 265.  std::pair::pair() effects overly restrictive
Гуглю. Получаю упомянутую ссылку.
1
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
26.09.2015, 15:31  [ТС] 9
Цитата Сообщение от hoggy Посмотреть сообщение
второй вариант накладывает дополнительное требование:
доступность конструктора копирования или перемещения.
hoggy, если у T не будет конструктора копирования, то нельзя передать в класс MyClass<T> этот объект?

Добавлено через 1 минуту

Не по теме:

нужно самому проверить


спасибо
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.09.2015, 15:35 10
Цитата Сообщение от IVSasha Посмотреть сообщение
если у T не будет конструктора копирования, то нельзя передать в класс MyClass<T> этот объект?
если конструктор копирования будет не доступен.

он может быть, но быть приватным, например.
в таком случае так же не скомпилиццо:

http://rextester.com/PQGBNL13679

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
 
template<class _Ty1,
    class _Ty2>
    struct _Pair_base
    {   // store a pair of values
    
    _Ty1 first;     // the first stored value
    _Ty2 second;    // the second stored value
 
    _Pair_base()
        : first(_Ty1()), second(_Ty2())
        {   // construct from defaults
        }
};
 
    
    
class sample
{
    sample(const sample&){}
    public:
    sample(){}
};
 
 
_Pair_base<int, sample> p;
 
int main()
{
    std::cout << "Hello, world!\n";
}
1
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
26.09.2015, 15:51  [ТС] 11
Как написал nmcf что второй вариант избыточен. Он требует конструктора копирования.
А для чего в STL, в том же std :: pair таким способом сделано?
C++
1
2
3
4
   _Pair_base()
        : first(_Ty1()), second(_Ty2())
        {   // construct from defaults
        }
Это уже получается требование для класса наличия конструктора копирования. Ведь можно и проще написать
C++
1
2
3
4
 _Pair_base()
        : first(), second()
        {   // construct from defaults
        }
Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Уже не применяется.
у меня еще применяется )
0
Tulosba
26.09.2015, 15:54
  #12

Не по теме:

Цитата Сообщение от IVSasha Посмотреть сообщение
у меня еще применяется )
обновись:)

0
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
26.09.2015, 16:02  [ТС] 13
Tulosba, не могу. компьютер слабоват. вот куплю поновее и обновлюсь.
сейчас Визуал Студио 2015 не установится потому компьютер слабый, не хватает минимальных требований
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.09.2015, 16:04 14
Лучший ответ Сообщение было отмечено IVSasha как решение

Решение

Цитата Сообщение от IVSasha Посмотреть сообщение
Ведь можно и проще написать
вот такое:
C++
1
: first(_Ty1()), second(_Ty2())
гарантированно приведет к вызову дефолтного конструктора.
который для фундаментальных типов (например для int ) запишит нолик.

вот такое:
C++
1
: first(), second()
по идее должно делать тоже самое.

однако во время дремучие,
когда мир ещё был юн, и зло только начинало поднимать свою голову на западе, и на востоке от средизмемья,
в некоторых компиляторах это было по разному реализованно.
поэтому ввели вот такой костыль.

в настоящее время уже не актуально.
потому что стандарт явно говорит:
явный вызов дефолтного конструктора для подов должен забить память нулями.
1
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
26.09.2015, 16:09  [ТС] 15
hoggy, большое спасибо за объяснения. тему можно закрыть. теперь все понятно
0
26.09.2015, 16:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2015, 16:09
Помогаю со студенческими работами здесь

Ошибка в шаблонном классе
Помогите исправить ошибку в 12 строчке: error C2248: CMyClass&lt;T&gt;::m_value: невозможно обратиться к...

Итератор в шаблонном классе
итератор в шаблонном классе?

Ошибки в шаблонном классе
Добрый день. Реализовал класс динамического массива. При проверке его работы столкнулся с ошибками,...

Параметры в шаблонном классе
Почему в шаблонном классе при описании функции надо два раза указывать тип параметра? В 1-ой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru