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

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

Войти
Регистрация
Восстановить пароль
 
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

Инициализация объекта строго константой - C++

07.10.2009, 20:35. Просмотров 773. Ответов 6

Пишу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Class
{ private:
    const int *Int;
  public:
    Class(const int *b) { Int=b; }
    int get() { return *Int; }
};
int main(int argc, char *argv[], char *env[])
{ system("clear");
        int aa=5;
  const int dd=11;
  Class c(&aa); // Это должно быть запрещено
  Class d(&dd); // Это допустимо
  Class e(70+7); // Это должно быть допустимо
  aa=66;
  std::cout<<c.get()<<std::endl;
  std::cout<<d.get()<<std::endl;
  std::cout<<e.get()<<std::endl;
  return 0;
}
Хочу, что б компилятор запрещал инициализацию переменной, и допускал инициализацию объекта строго константой или константным выражением.
Смысл - сэкономить память при передаче больших структур для парсинга.

БолЧелСпас
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Search..
07.10.2009, 20:49
  #2

Не по теме:

Бред.

Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
07.10.2009, 20:52     Инициализация объекта строго константой #3
skvor,
Хочу, что б компилятор запрещал инициализацию переменной, и допускал инициализацию объекта строго константой или константным выражением.
сделай соответствующий конструктор приватным

Смысл - сэкономить память при передаче больших структур для парсинга.
будем считать, что ты знаешь что делаешь ((Ж

БолЧелСпас
ВсеПож ((((((Ж
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
07.10.2009, 21:18  [ТС]     Инициализация объекта строго константой #4
Цитата Сообщение от Rififi Посмотреть сообщение
сделай соответствующий конструктор приватным
А что это даст, кроме невозможности инициализации вообще.
Цитата Сообщение от Rififi Посмотреть сообщение
будем считать, что ты знаешь что делаешь ((Ж
Ну, этот код просто пример моей попытки разобраться с константами.
Практически, задача состоит в написании простейшего парсера аля-XML и создания DOM.
Исходный текст представляется строкой, но для инициализации всех элементов модели, передаются только итераторы begin() и end(). Сам парсинг заключается только в том, что бы создать map состоящий из пар итераторов на начало и конец тегов и их элементов. Естественно, изменение самой строки должно быть недопустимо после создания DOM.

Вот я и озадачился - как написать конструктор, который принимал бы только ссылки (итераторы) на константы.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
09.10.2009, 00:10  [ТС]     Инициализация объекта строго константой #5
Всем спасибо, разобрался, тему можно закрыть.
Кому интересно, достаточно было определить константный тип.
Типа
C++
1
typedef const int cInt;
ну и соответственно конструктор д.б. описан с получением этого типа.
kravam
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
09.10.2009, 02:19     Инициализация объекта строго константой #6
Допустим.
А где и на чём экономия?
Я понимаю, экономить если используешь конструктор копирования, аргумент которого- переменная ссылочного типа. Тут да, экономишь на времени и памяти

А тут где экономия? Что так ты выделил память под объект и его приватные члены, а потом заполнил их соответтсвующими значениями, что эдак.
Доступ к ним определяется словом private. Вот тебе неизменяемость, которую ты достиг с помощью const.

Ничего не понимаю. Объяcни, а?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2009, 02:35     Инициализация объекта строго константой
Еще ссылки по теме:

Инициализация объекта из массива объктов класса C++
C++ Инициализация объекта нулями или мусором
Для агрегатного объекта требуется инициализация с использованием "{.}" C++
C++ Инициализация объекта (конструкторы)
C++ Выяснить является ли заданная последовательность строго возрастающей, строго убывающей, или ни тем и ни другим

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

Или воспользуйтесь поиском по форуму:
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
09.10.2009, 02:35  [ТС]     Инициализация объекта строго константой #7
Экономия в том, что вместо копирования, объект инициализируется ссылкой.
Но, трабла не в самой экономии, а в том, что при таком подходе, если инициализировать ссылкой на переменную, а потом эту переменную сдуру изменить, то формальной ошибки не будет, но ссылки внутри объекта станут недействительны.
Например, можно написать цикл прохождения итератора строки от std::string::begin() до std::string::end().
Внутри такого цикла синтаксически возможно изменение самой строки, но итераторы, вычисленные при инициализации будут в лажовом состоянии. Программа будет компилироваться, и, вероятно, работать без выдачи ошибок.
Yandex
Объявления
09.10.2009, 02:35     Инициализация объекта строго константой
Ответ Создать тему
Опции темы

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