crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> С++ forward declaration && using declaration, касательно имен опредленных в классе.
kwisp
  опции профиля:
сообщение 1.12.2010, 12:54
Сообщение #1


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


допустим есть класс в файле a.h
class A{
...
public:
enum EA{
....
};
...
};


возможно ли применить forward declaration или using declaration именно к перечислению EA ?
если да то как?

П.С.
чет с утра всего 3 градуса тепла - в офисе градусов 14 не больше. запутался.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 13:03
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


к вложенному классу нельзя, а, значит, к перечислению тоже

я в таких случаях делаю внешнее перечисление.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.12.2010, 13:15
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Алексей1153 @ 1.12.2010, 13:03) *
я в таких случаях делаю внешнее перечисление.

понимаешь, это класс не мой:(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 13:29
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


kwisp, то есть, менять его содержимое нельзя ? Или?

тогда такой вариант (да да, опять костыль ))) ): скопируй весь енум, сделай его внешним. Но где-то в коде обязательно поставь проверку, что все значения внешнего совпадают со значениями в классе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.12.2010, 15:05
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Алексей1153,
дело в том что этот enum мне нужен как параметр шаблона.
сам по себе enum это int просто именованный. и легко приводится к int.
а вот
std::vector<A::EA> к std::vector<int> не приводится некостыльным методом :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 15:46
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


kwisp, ой...

а можно пример такой необходимости ?
то есть без абстрактного вопроса - конкретную задачу в коде


может быть, просто отказаться от std::vector<A::EA> и вместо A::EA использовать int ?

или этот вектор в чужом классе определён ?

Сообщение отредактировал Алексей1153 - 1.12.2010, 15:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.12.2010, 15:51
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


я работаю с рукодельным протоколом обмена по сети.
код протокола поддерживается и ведется не мной. чтоб пользоваться классами протокола нужно включить заголовочник messages.h, хотелось бы его включить только в один cpp файл. поэтому и использую forward declaration различных классов этого протокола в своем заголовочном файле.
вот в числе прочих классов протокол предоставляет
класс Address в котором есть enum AttrType
класс Attribute<Address::AttrType>

так вот мне нужно в своем заголовчнике с помощью forward declaration сделать компилябельной строку

std::vector< Attribute<Address::AttrType> > attrList_;

включать messages.h в свой заголовочник крайне нежелательно. иначе тема не имеет смысла.

т.е. я в своем заголовчнике пишу
class Address;
class Attribute;


а с enum как поступить? текущий стандарт не поддерживает forward declaration enum и вложенных классов.
есть идеи?

Цитата(Алексей1153 @ 1.12.2010, 15:46) *
или этот вектор в чужом классе определён ?

да и в чужом тоже.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 15:53
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


с ходу идея лишь одна:
сделать класс-обобёртку

h
class A
{
   void* p;
   void F();
    A();
   ~A();
};

cpp

#include "Address.h"
#include "Attribute.h"

typedef std::vector< Attribute<Address::AttrType> > td_attrList;
A::A
{
    ((td_attrList*)p)=new td_attrList;
}

A::~A
{
   delete ((td_attrList*)p);
}

A::F()
{
       ((td_attrList*)p)->...;
}




я домой побёг, ночью ещё подумаю )

Сообщение отредактировал Алексей1153 - 1.12.2010, 15:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 18:55
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ну вот, как то так и надо. Больше ничего на голову не приходит. То есть, в заголовочниках будет мелькать только класс A , а в реализациях всегда приводить

((td_attrList*)a.p)->


можно, наверное, это дело замакросить:

#define def_attrList(a) (*((td_attrList*)a.p))

A a;

def_attrList(a). ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 2.12.2010, 8:07
Сообщение #10


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(kwisp @ 1.12.2010, 17:51) *
так вот мне нужно в своем заголовчнике с помощью forward declaration сделать компилябельной строку
std::vector< Attribute<Address::AttrType> > attrList_;


конструкция вида
Attribute<Address::AttrType> - это уже template, он зависит от AttrType.

а вектор из template - это уже template из template'а. тут нужно, чтобы у твоего внутреннего template'а соблюдались требования внешнего (для вектора это конструктор копии, если не ошибаюсь, и пустой конструктор), иначе копилер не сожрёт. а конструктор копии не может быть template'ом.

Сообщение отредактировал Iron Bug - 2.12.2010, 8:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 10:52