crossplatform.ru

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


  Ответ в С++ forward declaration && using declaration
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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


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

а вектор из template - это уже template из template'а. тут нужно, чтобы у твоего внутреннего template'а соблюдались требования внешнего (для вектора это конструктор копии, если не ошибаюсь, и пустой конструктор), иначе копилер не сожрёт. а конструктор копии не может быть template'ом.
Алексей1153 Дата 1.12.2010, 18:55
  ну вот, как то так и надо. Больше ничего на голову не приходит. То есть, в заголовочниках будет мелькать только класс A , а в реализациях всегда приводить

((td_attrList*)a.p)->


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

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

A a;

def_attrList(a). ...
Алексей1153 Дата 1.12.2010, 15:53
  с ходу идея лишь одна:
сделать класс-обобёртку

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)->...;
}




я домой побёг, ночью ещё подумаю )
kwisp Дата 1.12.2010, 15:51
  я работаю с рукодельным протоколом обмена по сети.
код протокола поддерживается и ведется не мной. чтоб пользоваться классами протокола нужно включить заголовочник 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:46
  kwisp, ой...

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


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

или этот вектор в чужом классе определён ?
kwisp Дата 1.12.2010, 15:05
  Алексей1153,
дело в том что этот enum мне нужен как параметр шаблона.
сам по себе enum это int просто именованный. и легко приводится к int.
а вот
std::vector<A::EA> к std::vector<int> не приводится некостыльным методом :(
Алексей1153 Дата 1.12.2010, 13:29
  kwisp, то есть, менять его содержимое нельзя ? Или?

тогда такой вариант (да да, опять костыль ))) ): скопируй весь енум, сделай его внешним. Но где-то в коде обязательно поставь проверку, что все значения внешнего совпадают со значениями в классе
kwisp Дата 1.12.2010, 13:15
 
Цитата(Алексей1153 @ 1.12.2010, 13:03) *
я в таких случаях делаю внешнее перечисление.

понимаешь, это класс не мой:(
Алексей1153 Дата 1.12.2010, 13:03
  к вложенному классу нельзя, а, значит, к перечислению тоже

я в таких случаях делаю внешнее перечисление.
kwisp Дата 1.12.2010, 12:54
  допустим есть класс в файле a.h
class A{
...
public:
enum EA{
....
};
...
};


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

П.С.
чет с утра всего 3 градуса тепла - в офисе градусов 14 не больше. запутался.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 0:11