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

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

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

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

07.10.2009, 20:35. Просмотров 790. Ответов 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;
}
Хочу, что б компилятор запрещал инициализацию переменной, и допускал инициализацию объекта строго константой или константным выражением.
Смысл - сэкономить память при передаче больших структур для парсинга.

БолЧелСпас
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2009, 20:35     Инициализация объекта строго константой
Посмотрите здесь:

инициализация объекта - C++
Как проинициализировать объект созданный с помощью new?

Инициализация данных объекта. - C++
Помогите найти ошибку. class Peson{ private: int Number; char FIO; int Pol; float Age; public: void print(); ...

Инициализация объекта (конструкторы) - C++
С помощью чего инициализируется этот объект f2? #include &lt;iostream&gt; //============================================== class...

Указатель и инициализация объекта класса - C++
Здраствуйте! Имеется большой класс импортирующий данные из файлов 3D-модели. В моём приложении он будет инициализироваться один раз для...

Инициализация объекта из массива объктов класса - C++
Ребята подскажите, как создать массив объектов класса с инициализацией каждого? CLASS1* class1; //нужно к примеру 5 объектов class1...

Инициализация объекта нулями или мусором - C++
Здравствуйте. Я бы воспользовался поиском, но даже не знаю, как ему сформулировать вопрос. Допустим, есть какой-то класс с...

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

Не по теме:

Бред.

Rififi
2338 / 1053 / 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
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
09.10.2009, 02:19     Инициализация объекта строго константой #6
Допустим.
А где и на чём экономия?
Я понимаю, экономить если используешь конструктор копирования, аргумент которого- переменная ссылочного типа. Тут да, экономишь на времени и памяти

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

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

Для агрегатного объекта требуется инициализация с использованием "{.}" - C++
Помогите.. как засунуть \\&quot; + string(z) + &quot;\\ правельно unsigned long Size = 256; char *z = new char; ...

"Повторная" инициализация объекта - C++
class A { int x, y; public A() { x = y = 100; } public A(int xx, int yy) { x = xx; y = yy;} }; A a1 = A(); a1 =...

Проблема с константой! - C++
Помогите додумать код,чтоб не было ошибки. #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Case с отрицательной константой - C++
switch (dir) { case 'С': case 'с': switch (cmd) { case '1': dir = 'З'; break; case '-1': dir = 'В'; ...


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

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

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