Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Откуда такое ограничение. 
:(
    Опции темы
KuMa1104
Дата 18.12.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Не понятна причина вот такого ограничения.
Код

class bbb
{
public:
        static const int ab = 7;        // Ok
    static const int e[] = {1,3};   //Error
};


Почему можно присваивать значения переменной ab
Но нельзя массиву?


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Чoо
Дата 18.12.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



правильно так:
Код

class bbb
{
public:
    static const int ab;
    static const int e[];
};
const int bbb::ab = 7;
const int bbb::e[] = {1,3};


а почему компилятор разрешает инициализировать ab для меня не совсем понятно. Но вообще, по умолчанию статические элемент ыкласса инициализируются нулем. Поэтому, смею предположить, что e[], поскольку это указатель, указывает на 0x00000000, а мы пытаемся заполнить память, которая еще не выделена. 
но я не уверен. Самому интересно даже стало почему так smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
boostcoder
Дата 18.12.2010, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(KuMa1104 @  18.12.2010,  00:04 Найти цитируемый пост)
static const int ab = 7;

еще так можно:
Код

enum { ab = 7 };

PM WWW   Вверх
KuMa1104
Дата 18.12.2010, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(boostcoder @  18.12.2010,  00:35 Найти цитируемый пост)
еще так можно:
код C++
1:
enum { ab = 7 };

Мда это уже вообще жуть. Как раз про это в книжке читаю.

Давайте разберемся по порядку.

вот так нельзя.
Код

class bbb
{
public:
    static int ab = 7;        // Error
    static const int e[] = {1,3};   //Error
};


Как я понимаю обявления класса описывает как должен выглядеть обект но не создает его.

Но добавляю  спецификатор const и О чудо!! всё работает!!!

Добавлено через 2 минуты и 1 секунду
Вот только в чудеса я не верю.
(Покрайне мере не в такие)

что меняться. Почему указание что элемент данных являеться const.
Позволяет написать такое ?
Код

class bbb
{
public:
        static const int ab = 7;        // Ok
};



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
mes
Дата 18.12.2010, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(9.4.2/4)

If a static data member is of const integral or const enumeration type, its declaration in the class
definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
scope if it is used in the program and the namespace scope definition shall not contain an initializer.


Добавлено через 51 секунду
Цитата(KuMa1104 @  17.12.2010,  23:43 Найти цитируемый пост)
Как я понимаю обявления класса описывает как должен выглядеть обект но не создает его.

без инициализатора объявление, с ним - определение..

Добавлено через 1 минуту и 22 секунды
Цитата(KuMa1104 @  17.12.2010,  23:43 Найти цитируемый пост)
Почему указание что элемент данных являеться const.
Позволяет написать такое ?

некоторая уловка разрешенная стандартом.. 



--------------------
PM MAIL WWW   Вверх
KuMa1104
Дата 18.12.2010, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



И вот так тоже нельзя
Код

class bbb
{
public:
    const int ab = 7;        // Error
};

видимо по тойже причине.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
boostcoder
Дата 18.12.2010, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



в новом стандарте это все позволено: http://www.open-std.org/JTC1/SC22/WG21/doc.../2008/n2756.htm
другое дело, что на данный момент, это реализовали только в EDG.
ждем...
PM WWW   Вверх
KuMa1104
Дата 18.12.2010, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(mes @  18.12.2010,  00:47 Найти цитируемый пост)
некоторая уловка разрешенная стандартом.. 


Вот не совсем понял. Значит это просто фикция такая. И в действительности нету ни каких оснований. Для такого запрета?????

Добавлено через 55 секунд
Ох как мы синхронно сообщения пишем . я уж путаться начал.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
boostcoder
Дата 18.12.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



зы
кстати позавчера вышел релиз gcc-4.5.2.
к концу 2010 года зашевелились-то как ;)


Добавлено через 3 минуты и 4 секунды

а в тестовой ветке, в версию 4.6.0 встроили поддержку Go: http://gcc.gnu.org/gcc-4.6/changes.html#go
и еще реализовали Range-based for smile 

PM WWW   Вверх
mes
Дата 18.12.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(boostcoder @  17.12.2010,  23:54 Найти цитируемый пост)
в новом стандарте это все позволено:

причины для "разрешения" такой инициализации разные..

Добавлено через 50 секунд
Цитата(KuMa1104 @  17.12.2010,  23:54 Найти цитируемый пост)
Вот не совсем понял. Значит это просто фикция такая. 

да.. это специально введено "нарушение" общей логики, для получения некоторых удобств..

Добавлено через 2 минуты и 12 секунд
не заморачивайтесь над этим.. запомните что так бывает.. а вернетесь тогда, когда действительно понадобится 
(к тому времени, будем надеяться, уже новый стандарт будет, где подобные места немного разровнены )


--------------------
PM MAIL WWW   Вверх
KuMa1104
Дата 18.12.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Да почитал.
Но мне кажется что для меня это пока слишком глубаковато. Думаю если даже вдумчиво прочитаю многое ускользнет.

Ох как это не похоже на родной C#((

Хорошо но я могу написать так
Код

bbb::ab  = 7;


Я так понимаю это наиболее корректный способ.

Добавлено через 2 минуты и 11 секунд
Цитата(mes @  18.12.2010,  00:47 Найти цитируемый пост)
без инициализатора объявление, с ним - определение..


я так понимаю что
Код

bbb::ab  = 7;

это и естm инициализатор.



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
mes
Дата 18.12.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KuMa1104 @  18.12.2010,  00:02 Найти цитируемый пост)
Хорошо но я могу написать так

для статической функции ? при определении вне класса..

Добавлено через 1 минуту и 15 секунд
Цитата(KuMa1104 @  18.12.2010,  00:02 Найти цитируемый пост)
Я так понимаю это наиболее корректный способ.

у Чoо в посту показан "наиболее корректный" способ.. smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.12.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



вот так еще можно:
Код

#include <iostream>

struct type {
   type():e({0,1,2,3,4,5,6,7,8,9}) {}
   const int e[10];
};

int main() {
   type t;
   for ( int i = 0; i < sizeof(type::e)/sizeof(type::e[0]); ++i ) {
      std::cout << t.e[i] << std::endl;
   }
}

http://liveworkspace.org/code/f068cd189356...a057a395bf44dd4

Добавлено через 2 минуты
Цитата(mes @  18.12.2010,  01:05 Найти цитируемый пост)
у Чoо в посту показан "наиболее корректный" способ..

а мне enum{ ab = 7 }; привычнее.
PM WWW   Вверх
mes
Дата 18.12.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(boostcoder @  18.12.2010,  00:06 Найти цитируемый пост)
вот так еще можно:

а что gcc еще не поддерживает range based for loop  ? или нa lws "старый" ?


Добавлено через 1 минуту и 36 секунд
Цитата(boostcoder @  18.12.2010,  00:06 Найти цитируемый пост)
а мне enum{ ab = 7 }; привычнее. 

"корректный" для инициализации статических членов.. a enum в данном случае сбоку.. 


Это сообщение отредактировал(а) mes - 18.12.2010, 01:10


--------------------
PM MAIL WWW   Вверх
KuMa1104
Дата 18.12.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(boostcoder @  18.12.2010,  01:06 Найти цитируемый пост)
вот так еще можно:
код C++

#include <iostream>
struct type {
   type():e({0,1,2,3,4,5,6,7,8,9}) {}
   const int e[10];
};
int main() {
   type t;
   for ( int i = 0; i < sizeof(type::e)/sizeof(type::e[0]); ++i ) {
      std::cout << t.e[i] << std::endl;
   }
}


Бр.. На это вообще пока смотреть жутко.
Цитата(mes @  18.12.2010,  01:05 Найти цитируемый пост)
у Чoо в посту показан "наиболее корректный" способ.. 


Хорошо. Кажется смысл понял)



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0998 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.