Форум программистов, компьютерный форум CyberForum.ru

Не инициализируются переменные в констукторе класса - C++

Восстановить пароль Регистрация
 
Ni_kola
0 / 0 / 0
Регистрация: 20.01.2015
Сообщений: 2
14.07.2015, 16:15     Не инициализируются переменные в констукторе класса #1
Не хотят инициализироватся данные после двоеточия, в следствие чего нельзя создать объект данного класса. При инициализации в теле конструктора с помощью присваивания проблем не возникает.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#ifndef TEST_H
#define TEST_H
 
#include <iostream>
 
using namespace std;
 
template<typename T>
class Stek
{
public:
    Stek(int = 10);
    ~Stek()
    {
        delete [] stekPtr;
    }
    bool push(const T&);
    bool pop(T&);
    bool isEmpty()
    {
        return top == -1;
    }
    bool isFull()
    {
        return top == size-1;
    }
        
private:
    T *stekPtr;
    int size;
    int top;
 
};
 
template<typename T>
Stek<T>::Stek(int s) 
    : size(s > 0 ? s : 10),  //Не инициализируются данные
    top(-1), 
    stekPtr(new T[size])    
{
    
}
 
template <typename T>
bool Stek<T>::push(const T& pushValue)
{
    if(!isFull())
    {
        stekPtr[++top] = pushValue;
        return true;
    }
    return false;
}
 
template <typename T>
bool Stek<T>::pop(T& popValue)
{
    if(!isEmpty())
    {
        popValue = stekPtr[top--];
        return true;
    }
    return false;
}
 
 
#endif
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
14.07.2015, 16:20     Не инициализируются переменные в констукторе класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Ni_kola Посмотреть сообщение
Не хотят инициализироватся данные после двоеточия
Порядок объявления должен соответстовать порядку инициализации.
C++
1
2
3
4
5
private:
    int size;
    int top;
    T *stekPtr;
};
EugeneQ
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 37
14.07.2015, 16:22     Не инициализируются переменные в констукторе класса #3
Цитата Сообщение от Ni_kola Посмотреть сообщение
public: Stek(int = 10);
Здесть тоже нужно указать Stek(int s = 10) : size(s > 0 ? s : 10), top(-1), stekPtr(new T[size]) {};
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
14.07.2015, 16:23     Не инициализируются переменные в констукторе класса #4
Здесь:
C++
1
2
3
4
5
6
7
template<typename T>
Stek<T>::Stek(int s) 
    : size(s > 0 ? s : 10),  //Не инициализируются данные
    top(-1), 
    stekPtr(new T[size])    
{    
}
На самом деле инициализация будет проведена в порядке объявления (компилятор с включенной диагностикой об этом предупреждает). Т.е. сначала у тебя выделялась память, т.к. член stekPtr объявлен первым. Естественно бралось некорректное значение size для этого. Только потом инициализировался size условным выражением. А top задавался самым последним.
Ni_kola
0 / 0 / 0
Регистрация: 20.01.2015
Сообщений: 2
14.07.2015, 16:23  [ТС]     Не инициализируются переменные в констукторе класса #5
Спасибо большое. Часа два разглядывал код и не мог найти ошибку))
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
14.07.2015, 16:28     Не инициализируются переменные в констукторе класса #6
Цитата Сообщение от EugeneQ Посмотреть сообщение
Здесть тоже нужно указать Stek(int s = 10) :
А вот этого как раз делать не надо.

Добавлено через 4 минуты
Цитата Сообщение от Ni_kola Посмотреть сообщение
Часа два разглядывал код и не мог найти ошибку))
Врубай предупреждения на максимум в своем компиляторе.
EugeneQ
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 37
14.07.2015, 18:16     Не инициализируются переменные в констукторе класса #7
Цитата Сообщение от DrOffset Посмотреть сообщение
А вот этого как раз делать не надо.
Это связано с конструктором по умолчанию?
Получается не определённость.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 18:31     Не инициализируются переменные в констукторе класса
Еще ссылки по теме:

Ошибка: не определены переменные класса C++
C++ Не инициализируются данные
Зачем переменные инициализируются нулем? C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
14.07.2015, 18:31     Не инициализируются переменные в констукторе класса #8
Цитата Сообщение от EugeneQ Посмотреть сообщение
Это связано с конструктором по умолчанию?
Это связано в с тем, что параметры по умолчанию указываются только при объявлении функции. Если объявление и определение разнесены, но в определении дублировать умолчание для параметра нельзя.
Например вот такой код приведет к ошибке компиляции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
public:
    A(int a = 10);
};
 
A::A(int a = 10)
{
}
 
int main()
{
}
http://rextester.com/JZP53560
Yandex
Объявления
14.07.2015, 18:31     Не инициализируются переменные в констукторе класса
Ответ Создать тему
Опции темы

Текущее время: 12:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru