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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
#1

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

16.03.2012, 02:22. Просмотров 3678. Ответов 15
Метки нет (Все метки)

Такой вопрос, как инициализировать константные поля класса? Работают конструкции вида 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 должна быть произвольного размера
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 02:22     Константные поля класса
Посмотрите здесь:

Константные поля и методы - C++
А можете объяснить, что такое константные поля и методы в классах?

Константные статические объекты класса. - C++
Здравствуйте. Есть класс &quot;матрица&quot; нужно задать константные матрицы такие как E - единичная матрица и т.д., как это сделать? #include...

Константные методы и объекты класса - C++
Это необходимость, или явная подстраховка того, что бы объект (константный) работал с себе подобными методами класса ?

Константные поля и операция присвоения - как быть? - C++
У меня в классе реализовано константное поле: int const constant; инициализация такой переменной происходит в конструкторе в списке...

Где инициализировать константные данные класса? - C++
Вот ошибка: в пределах класса могут быть инициализированы только статестические константы данные-члены целого типа. private: string...

Константные и не константные ссылки. Приведения типов. Нужно уточнение - C++
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &amp;y = x; const double &amp;y = x; Почему для не...

Константные функции-члены класса, возвращающие ссылку на константу - C++
Упражняюсь по книге Липпмана, выполняю задания по теме классы. Необходимо реализовать класс person, который способен хранить имя и адрес...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:35     Константные поля класса #2
Поля, инициализируемые при помощи синтаксиса списка инициализации получают свое значение еще до входа в тело конструктора. Присваивание константе значения в теле конструктора уже является именно ПРИСВАИВАНИЕМ, что по определению не возможно для константы.
besh]<a
13 / 11 / 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
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
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
13 / 11 / 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
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
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
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
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:29     Константные поля класса #13
Цитата Сообщение от 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
13 / 11 / 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     Константные поля класса
Еще ссылки по теме:

Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. - C++
Помогите решить с объяснениями. Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. ...

Поля класса - C++
здравствуйте ) извините заранее если глупый вопрос :sorry: я просто новичок) class mycl { public: char a, b; }; ...

поля класса - C++
Задача заключается в поиске площади треугольника через класс. Программой должна быть предусмотрена проверка корректности ввода сторон...

Static поля класса - C++
объясните нубу, вот имею я такой код на С# class WebResponse { public static string GET(string Url, string Data) ...

Вывести поля класса - C++
Положим, есть класс A: class A { public: int a,b,c,d; // . . . какие-то функции } Как перегрузить оператор &lt;&lt; чтобы можно...


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

Или воспользуйтесь поиском по форуму:
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     Константные поля класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru