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

Константные поля класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 02:22     Константные поля класса #1
Такой вопрос, как инициализировать константные поля класса? Работают конструкции вида obj():t(0){}; который используется в примере ниже. А если написать полноценное тело конструктора, то пишет что нельзя модифицировать константу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class obj{
    const int t;
    const char* str;
    obj():t(0){};
    obj(const int p,  char* pstr):
        t(p),
        str(pstr)
    {};
    ~obj(){
        delete [] str;
    }
};
Не совсем уверен правильность деструктора, но вылетает с ошибкой.

В особенности интересует можно ли как нибудь задать и заполнить поле класса const char* str;
str должна быть произвольного размера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:35     Константные поля класса #2
Поля, инициализируемые при помощи синтаксиса списка инициализации получают свое значение еще до входа в тело конструктора. Присваивание константе значения в теле конструктора уже является именно ПРИСВАИВАНИЕМ, что по определению не возможно для константы.
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 02:35  [ТС]     Константные поля класса #3
Не уверен потому что не было оператора new, мне думается что str статическая. Хотя:
C++
1
2
    char* str1="FDSF";
    delete [] str1;
работает.

Konstantin_D, а вы не знаете в деструкторе нужен delete?
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:42     Константные поля класса #4
при наличии в деструкторе оператора delete[], все конструкторы должны выделять память оператором new[]. При этом условии деструктор правильный. Если создаешь пустую строку, все равно в конструкторе пиши
C++
1
str = new char[1]; str[0]='\0';
Зачем тебе указатель на константную строку?

Добавлено через 1 минуту
зачем освобождать память, которую не выделял динамически?
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 02:44     Константные поля класса #5
рекомендую конструкторы всётаки в public
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:57     Константные поля класса #6
Цитата Сообщение от besh
<a;2799674]мне думается что str статическая
статической она станет(переменная str) как только ты ее объявишь статической
C++
1
static char* str;
Добавлено через 4 минуты
А что вообще нужно реализовать?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstring>
 
class Str
{
    char* str;
    Str(const Str& s);
    Str& operator=(const Str& s) {return *this;}
public:
    Str();
    Str(const char* pch);
    ~Str() {delete[] str;}
};
Str::Str()
{
    str = new char[1];
    str[0] = '\0';
}
Str::Str(const char* pch)
{
    str = new char[strlen(pch)+1];
    strcpy(str,pch);
}
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 03:04  [ТС]     Константные поля класса #7
Меня интересовала инициализация константных динамических массивов, так что ли сказать. Видимо такого вообще не бывает.
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 03:08     Константные поля класса #8
тут разве не динамический массив? Размер массива зависит от того чем инициализируют
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class obj{
        const int t;
        const char* str;
public:
        obj():t(0){};
        obj(const int p,  char* pstr) :
                t(p),
                str(pstr)
        {};
};
int main()
{
    obj test(2231,"lemasdasdasdingi");
    obj * asdas = new obj();
    obj * asd   = new obj(5,"1234");
 
    delete asdas;
    delete asd;
    return 0;
}
В примере Константина еще динамичней
Russian_Dragon
 Аватар для Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:08     Константные поля класса #9
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Str& operator=(const Str& s) {return *this;}
Я конечно извиняюсь, но в чем суть такого оператора?О_о
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 03:11     Константные поля класса #10
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
Я конечно извиняюсь, но в чем суть такого оператора?О_о
Иначе будет будет использоваться стандартный конструктор копирования.
В "Прата С. - Язык программирования С++. Лекции и упражнения" глава была этому посвящена, с разбором возможных ошибок из-за стандартного конструктора копирования.
Russian_Dragon
 Аватар для Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:21     Константные поля класса #11
Цитата Сообщение от besh]<a Посмотреть сообщение
Меня интересовала инициализация константных динамических массивов, так что ли сказать. Видимо такого вообще не бывает.
В С++ можно всё, просто нужно знать как.

По идее такое вряд ли нужно, но это можно сделать так:
C++
1
2
3
template<int t, char* str>
class obj{
}
Добавлено через 5 минут
Цитата Сообщение от Cool-T Посмотреть сообщение
Иначе будет будет использоваться стандартный конструктор копирования.
В "Прата С. - Язык программирования С++. Лекции и упражнения" глава была этому посвящена, с разбором возможных ошибок из-за стандартного конструктора копирования.
Ну тогда так и пиши.
C++
1
2
3
4
5
Str& operator=(const Str& s) {
delete str;
str = new char[strlen(s.str)+1];
        strcpy(s.str,pch);
}
А у тебя фигня выходит. Получается, что операция копирования информации, не будет выполнена.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 03:22     Константные поля класса #12
C++
1
Str& operator=(const Str& s) {return *this;}
если этого не сделать, то будет использоваться оператор присваивания, заданный по умолчанию, выполняющий поэлементное присваивание. А этого в данном случае допустить нельзя!
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
#include <iostream>
#include <cstring>
using std::endl;
using std::cout;
using std::ostream;
 
class Str
{
    char* str;
    Str(const Str& s);
    Str& operator=(const Str& s) {return *this;}
public:
    Str();
    Str(const char* pch);
    ~Str() {delete[] str;}
    friend ostream& operator<<(ostream& os, const Str& s);
};
Str::Str()
{
    str = new char[1];
    str[0] = '\0';
}
Str::Str(const char* pch)
{
    str = new char[strlen(pch)+1];
    strcpy(str,pch);
}
ostream& operator<<(ostream& os, const Str& s)
{
    os << s.str;
    return os;
}
int main()
{
    Str s2("Hello, World!");
    Str s1;
//  Str s1(s2);
//  s1 = s2;
    cout << "s1: *" << s1 << "*\n";
    cout << "s2: *" << s2 << "*\n";
}
Эти объявления делают конструктор копирования и оператор присваивания недоступными.
Попробуй поубирать комментарии в main()
Russian_Dragon
 Аватар для Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:29     Константные поля класса #13
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Эти объявления делают конструктор копирования и оператор присваивания недоступными.
А, ты просто блокируешь. Всё - согласен, никаких вопросов.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 03:29     Константные поля класса #14
Лучше напиши так:
C++
1
2
3
4
5
6
7
8
9
10
11
Str& Str::operator=(const Str& s) 
{
    if (this == &s)
        return *this;
    
    delete [] str;
    str = new char[strlen(s.str)+1];
    strcpy(str,s.str);
 
    return *this;
}
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 03:58  [ТС]     Константные поля класса #15
Цитата Сообщение от Cool-T Посмотреть сообщение
тут разве не динамический массив? Размер массива зависит от того чем инициализируют
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class obj{
        const int t;
        const char* str;
public:
        obj():t(0){};
        obj(const int p,  char* pstr) :
                t(p),
                str(pstr)
        {};
};
int main()
{
    obj test(2231,"lemasdasdasdingi");
    obj * asdas = new obj();
    obj * asd   = new obj(5,"1234");
 
    delete asdas;
    delete asd;
    return 0;
}
В примере Константина еще динамичней
Я уже писал что меня смущает вот этот момент: const char* str; В данном случае ввиду отсутствия оператора new, str считается статическим массивам?
Ответ на этот вопрос решил бы все мои сомнения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2012, 12:54     Константные поля класса
Еще ссылки по теме:

Константные методы и объекты класса C++
Где инициализировать константные данные класса? C++
Константные и не константные ссылки. Приведения типов. Нужно уточнение C++

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

Или воспользуйтесь поиском по форуму:
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 12:54     Константные поля класса #16
Без new это не динамический массив. В этом случае delete не нужен. А str это только указатель на массив, а не сам массив.
C++
1
obj():t(0),str("aaa bbb ccc!"){}
Константам задавай значения в списке инициализации.
Если t - это длина строки, то попробуй так:
C++
1
obj():t(strlen(str)),str("aaa bbb ccc!"){}
Но только в определении класса объявляй t после str. Это важно. Переменные инициализируются в порядке объявления в классе (порядок их следования в списке инициализации значения не имеет).
Yandex
Объявления
16.03.2012, 12:54     Константные поля класса
Ответ Создать тему
Опции темы

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