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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему статические данные, нельзя "брать" из переменных 
V
    Опции темы
Alek86
Дата 15.1.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вот в таком коде
Код

struct S1 {
  typedef int Type;
  static int F() {return 0;}
  static int m_i;
};

int main() {
  S1 s1;
//   s1::Type i1;
//   s1::F();
//   s1::m_i;
  S1::Type i2;
  S1::F();
  S1::m_i;
}


если раскомментировать закомментированные строки, прога не компилится
как я понимаю. так обращаться к статикам нельзя по стандарту. но почему. не понимаю. может кто знает?


--------------------
user posted image    user posted image
PM MAIL   Вверх
_stranger_
Дата 15.1.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код


int main() {
  S1 s1;
//   s1.F(); // попробуй вот так обратиться...
//   s1.m_i;
  S1::Type i2;
  S1::F();
  S1::m_i;
}

PM MAIL   Вверх
Lazin
Дата 15.1.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



вообще можно обращаться к статическим переменным (функциям) через операторы . и ->, но это лучше не делать так как код будет труднее читать

Код

  //выглядит как обращение к обычному методу
   s1.F();
   //выглядит "правильно"
   S1::F();


Это сообщение отредактировал(а) Lazin - 15.1.2008, 11:57
PM MAIL Skype GTalk   Вверх
NiJazz
Дата 15.1.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

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



Статические переменные и функции класса можно рассматривать как обычные переменные и функции в пространстве имён, но имеющие доступ к приватным членам класса.

Пример:
Код

class C
{
public:
    C() : n( 0 ) {}

static void f( C& c )
{
    c.n = 100;
};

private:
    int n;
};

int _tmain(int argc, _TCHAR* argv[])
{
    C c;

    C::f( c );

    return 0;
}

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


Эксперт
***


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

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



мне оно не нравится потому, как если есть
Код

std::vector<int> v;

то я не могу написать
Код

v::iterator;


я знаю, что можно std::vector<int> затайпдефить, но все равно это уже не то...
ибо по смыслу мне нужен итератор именно для типа ЭТОЙ ПЕРЕМЕННОЙ а не для ЭТОГО ТИПА

Это сообщение отредактировал(а) Alek86 - 15.1.2008, 12:12


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 15.1.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



вроде-бы в следующей версии стандарта можно будет писать
Код

std::vector<int> vect;
auto i = vect.begin();

а компилятор немного подумает и определит тип переменной i
PM MAIL Skype GTalk   Вверх
Alek86
Дата 15.1.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да вот, ждем-с smile

правда, все равно неясно почему написать так (как в вопросе) нельзя...

Это сообщение отредактировал(а) Alek86 - 15.1.2008, 12:48


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 15.1.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alek86 @  15.1.2008,  12:44 Найти цитируемый пост)
правда, все равно неясно почему написать так (как в вопросе) нельзя...

потому-что у оператора :: другой смысл, это было-бы нелогично

Добавлено через 1 минуту и 20 секунд
Цитата(Lazin @  15.1.2008,  12:36 Найти цитируемый пост)
вроде-бы в следующей версии стандарта можно будет писать

в языке D это уже есть
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 15.1.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Alek86 @  15.1.2008,  10:25 Найти цитируемый пост)
если раскомментировать закомментированные строки, прога не компилитсякак я понимаю. так обращаться к статикам нельзя по стандарту. но почему. не понимаю. может кто знает?

потому что оператор :: левым операндом должен иметь тип, а не переменную
PM MAIL   Вверх
Alek86
Дата 15.1.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Fazil6, а почему?
(меня как раз именно это и интересует)


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 15.1.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Alek86, считай недоработка языка. Идеального ничего не бывает.
PM   Вверх
Fazil6
Дата 15.1.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Alek86 @  15.1.2008,  12:07 Найти цитируемый пост)
Fazil6, а почему?(меня как раз именно это и интересует)

ну видимо потому, что есть точка и стрелка для доступа к членам и нафига здесь еще и :: , а выковыривания типа из объекта вроде
Код

v::iterator i = v.begin();

это совсем уж другая задача. Ведь в объекте нет описания этого типа (я так думаю). Т.е компиллятору нужно будет определить, что это за тип такой объекта v и уже из него добывать, а тут еще наследование может под ногами путаться, и тем более если позволить добывать таким оператором переменные из объектов, то получается неоднозначность между тем чего мы хотим (тип или переменную, typename вроде тока в шаблонах можно применять)
PM MAIL   Вверх
Alek86
Дата 15.1.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



я больше мнения bsa придерживаюсь (ну, или может исторические причины)

Fazil6, вроде, наследование никак повлиять не может, ибо статические виртуальные функции невозможны, и, поскольку С++ контекстно-зависимый, то и без того неоднозначностей хватает... В шаблонах typename из-за того, что не всегда виден контекст....


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 15.1.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Alek86, доступ к статическим функциям возможен через точку или стрелку!
PM   Вверх
mes
Дата 15.1.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  15.1.2008,  12:05 Найти цитируемый пост)

Код


v::iterator;


Код

struct Base 
{...
static void f(); 
};
struct A:public Base 
{...
static void f(); 
};
....
Base * p;
p = new A;
// (*p)::f(); какую ф-цию здесь вызвать ?




--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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