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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extern и enum 
V
    Опции темы
Riddik
Дата 4.5.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В одном файле определено перечисление:

enum ms {ONE, TWO} State;

Как в другом файле можно обратиться к State?

компилятор ругается на 

extern enum State ;

или

extern ms State;
PM MAIL   Вверх
math64
Дата 4.5.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



state.h:
Код

enum ms {ONE, TWO};
extern enum ms State;

state.cpp:
Код

#include <state.h>
enum ms State = ONE;

main.cpp:
Код

#include <state.h>
int main(int argc, char**argv) {
  State = TWO;
  return 0;
}

PM   Вверх
azesmcar
Дата 4.5.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Riddik

ему должен быть известен тип, обяви тип enum ms {ONE, TWO} в заголовочном файле, иклудь в обоих юнитах. А дальше экстерном - как обычно.

Это сообщение отредактировал(а) azesmcar - 4.5.2009, 15:48
PM   Вверх
math64
Дата 4.5.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PS: нужно #include "state.h"
PM   Вверх
mes
Дата 4.5.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



a еще лучше (имхо) объявлять переменные не  enum типа,  а простого целочисленного.
А енумы использовать как набор констант (для сравнения или присваивания).  smile 

Это сообщение отредактировал(а) mes - 4.5.2009, 15:50


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


Опытный
**


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

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



Большое спасибо всем smile
PM MAIL   Вверх
zim22
Дата 4.5.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Почему нельзя создать два enum c различными именами, но частично одинаковым содержимым?
Код

enum E{A, B};
enum D{X, A}; //  error C2365: 'A' : redefinition; previous definition was 'enumerator'



--------------------
PM MAIL   Вверх
azesmcar
Дата 4.5.2009, 16:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



zim22

Потому что члены перечисления входят в то пространство имен, в котором было обявлено само перечисление.

Код

enum D {A, X}
//доступ к Х осуществляется без какого либа пространства имен

в вашем примере имя А фигурирует в обоих перечислениях и если написать
std::cout << (int)A;
будет неоднозначность - какую именно выводить.
Можно сделать так
Код

namespace E
{
    enum {A, B};
}

namespace D
{
    enum {X, A};
}

и кстати мне кажется что так и надо использовать перечисления smile

Это сообщение отредактировал(а) azesmcar - 4.5.2009, 16:33
PM   Вверх
mes
Дата 4.5.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  4.5.2009,  15:24 Найти цитируемый пост)
и кстати мне кажется что так и надо использовать перечисления smile

поддерживаю  smile 


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 4.5.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(azesmcar @  4.5.2009,  16:24 Найти цитируемый пост)
и кстати мне кажется что так и надо использовать перечисления

Эээ... Ну и как мне теперь создать переменную типа этого енума?!


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 4.5.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Любитель

Если нужно создавать - тогда перечисление нужно именовать разумеется
Код

namespace E
{
    enum TE {A, B};
}
namespace D
{
    enum TD {X, A};
}

Код

E::TE v;
D::TD q;

пространство имен этому никак не препятствует

Это сообщение отредактировал(а) azesmcar - 4.5.2009, 17:00
PM   Вверх
mes
Дата 4.5.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  4.5.2009,  15:55 Найти цитируемый пост)
Эээ... Ну и как мне теперь создать переменную типа этого енума?! 

Любитель,  А можно узнать хоть одно преимущество, которое дается при создании переменнной типа енум ?
я, к сожалению,  вижу только недостатки. 

P.S. чтоб не подумали, что я противник енумов, повторюсь -
я стороник такого подхода :
Цитата(mes @  4.5.2009,  14:49 Найти цитируемый пост)
 лучше (имхо) объявлять переменные не  enum типа,  а простого целочисленного.
А енумы использовать как набор констант (для сравнения или присваивания).  smile 



Это сообщение отредактировал(а) mes - 4.5.2009, 17:20


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


Эксперт
****


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

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



mes, проверка на этапе компиляции.
Код
enum A {a, b, c};
enum B {d, e, f};

A x;
x = f; //ошибка

Кстати, enum используется в шаблонном программировании для превращения чисел в типы (у Александреску написано), но тут уже без переменных собственно.
PM   Вверх
J0ker
Дата 4.5.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  4.5.2009,  15:49 Найти цитируемый пост)
a еще лучше (имхо) объявлять переменные не  enum типа,  а простого целочисленного.

правильно
а все указатели объявлять типа void*
нахрена нам контроль типов - мыж сами умные


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


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


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

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



Цитата(bsa @  4.5.2009,  17:19 Найти цитируемый пост)
mes, проверка на этапе компиляции.

которая подводит в неподходящий момент :
Код

enum EA { ea1, ea2 };
enum EB { eb1, eb2 };
..
EA a =ea1;
if (a==eb1) {}

 smile 
Цитата(bsa @  4.5.2009,  17:19 Найти цитируемый пост)
Кстати, enum используется в шаблонном программировании для превращения чисел в типы (у Александреску написано), но тут уже без переменных собственно. 

употребление в шаблонах отдельная тема.

Цитата(J0ker @  4.5.2009,  17:40 Найти цитируемый пост)
а все указатели объявлять типа void*
нахрена нам контроль типов - мыж сами умные 

насчет void* Вы не по адресу - я стороник типизации.
Но, наверно, я не сталкивался с такими задачами, когда мне нужен был именно контроль по enum-типу и  при  этом хватало бы гарантий которые он дает.
(старался типобезопасность обеспечить через более "надежные" типы).
Обычно enum использую для битовых комбинаций флагов, и в таком случае от злоупотребления енумов получаю лишь лишнюю писанину:
Код

enum EA { ea1, ea2 };
ЕА а   = ea1 | ea2; // не хочет без каста (хотя и понятно почему)

Я вполне допускаю, что есть и другие ситуации, в которых от типизации по енуму была бы польза (не отказался от примера такой задачи),
но на текущем этапе придерживаюсь упомянутого ранее мнения .
smile


Это сообщение отредактировал(а) mes - 4.5.2009, 19:22


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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