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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вывести такой вектор? уже чето запутался 
V
    Опции темы
Alek86
Дата 21.3.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



сразу предупрежу, что тема создана не только на этом форуме, но уж очень желательно сегодня мне с ней разобраться...

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

дана такая вот иерархия структур и вектор, заполненный ими:
Код

struct Interface {};

template<typename T>
struct Struct1 : Interface {
  Struct1(int i) : m_i(i) {}
  int m_i;
};

template<typename T>
struct Struct2 : Interface {
  Struct2(int i1, int i2) : m_i1(i1), m_i2(i2) {}
  int m_i1, m_i2;
};

int main() {
  std::vector<Interface*> vect;
  vect.push_back(new Struct1<int>(1));
  vect.push_back(new Struct2<int>(1, 2));
  vect.push_back(new Struct1<char>(433));
  vect.push_back(new Struct2<double>(3, 4));
  vect.push_back(new Struct2<float>(12, 344));
  vect.push_back(new Struct1<double>(143));

  PrintVector(vect);
}



нужно написать функцию, которая сможет вывести этот вектор.
Естественно, вектор может быть заполнен в какой угодно последовательности...
+ условие - структуры трогать нельзя - ни добавлять ни менять, ни удалять. Они - в ридонли коде. 

Добавлено Сегодня, 17:33
кстати, для решения разрешены любые боле-мене стандартные уловки - и динамиккаст и т.п.

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


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Alek86 @  21.3.2008,  16:37 Найти цитируемый пост)
кстати, для решения разрешены любые боле-мене стандартные уловки - и динамиккаст и т.п.

Ну, нормальное решение, имхо, в Intefrace virtual print(std::stringstream&).
Делать разные структуры, а потом их выводить "единообразно" без общих методов - имхо, нагло.

Если же кровь из носа и трогать нельзя совсем - проходимся по вектору, делаем столько dynamic_cast'ов, сколько структур у нас имеется, проверяя от предка к родителям, и выводя члены определённой структуры.

Добавлено через 31 секунду
З.Ы. Alek86, про кнопку "Код" ты зря забыл smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Alek86
Дата 21.3.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(JackYF @  21.3.2008,  17:43 Найти цитируемый пост)
 Alek86, про кнопку "Код" ты зря забыл 

исправил smile


Цитата(JackYF @  21.3.2008,  17:43 Найти цитируемый пост)
проходимся по вектору, делаем столько dynamic_cast'ов, сколько структур у нас имеется, проверяя от предка к родителям, и выводя члены определённой структуры.

можешь этот кусок в коде?
у меня как раз нестыковка с динамик кастами и шаблонами - куда кастить?


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


Эксперт
***


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

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



вроде как решения по условию задачи не существует.
вопрос решен


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


Эксперт
****


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

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



А помоему имеет. Схожая задача описана в "современное проектирование на С++" А. Александресску (мультиметоды).
PM   Вверх
Alek86
Дата 21.3.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



можно тогда примерный вид функции PrintVector?

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


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


Эксперт
****


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

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



блин. там очень сложно. создается список возможных типов StructN, затем список возможных параметров этих StructN (int, char, double...), затем генерируется список возможных комбинаций и из этого списка генерируется набор функций вывода...
Код я так запросто тут не напишу. Это довольно объемный текст получится. Проще скачать и посмотреть. smile
PM   Вверх
JackYF
Дата 21.3.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(bsa @  21.3.2008,  18:10 Найти цитируемый пост)
Схожая задача описана в "современное проектирование на С++" А. Александресску (мультиметоды).

Омф. А они-то тут причём? тут загвоздка в том, что в иерархию классов нельзя добавить нужную виртуальную функцию. Мультиметоды - это же расширение виртуальных функций на зависимость от типа двух и более объектов?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 22.3.2008, 00:15 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(JackYF @ 21.3.2008,  20:07)
Омф. А они-то тут причём? тут загвоздка в том, что в иерархию классов нельзя добавить нужную виртуальную функцию. Мультиметоды - это же расширение виртуальных функций на зависимость от типа двух и более объектов?

Если честно, я читал эту тему "по диагонали". Уж очень она какой-то абстрактной мне показалась. Поэтому могу чего-то перепутать.
Просто в той книжке рассматривался ряд случаем, компоновка которых может дать решение этой задачи. Но, имхо, проще добавить виртуальный метод в интерфейс...  smile 
PM   Вверх
blinded
Дата 22.3.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Структуры трогать нельзя, а вектор трогать можно? Это обязательно должен быть вектор Interface*?
PM MAIL   Вверх
Alek86
Дата 22.3.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



blinded, условие задачи - вообще написать функцию smile
то есть ничего трогать нельзя


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



хак методом:
Код

struct Interface {
    virtual ~Interface();
};

void PrintVector(const std::vector<Interface*>& vect)
{
    for (std::vector<Interface*>::const_iterator iter = vect.begin(); iter != vect.end(); ++iter)
    {
        std::string str = typeid(*(*iter)).name();
        str.resize(7);
        if (str == "Struct1")
        {
            int* i = reinterpret_cast<int*>(*iter);
            std::cout<<i[1]<<std::endl;
        }
        else if (str == "Struct2")
        {
            int* i = reinterpret_cast<int*>(*iter);
            std::cout<<i[1]<<", ";
            std::cout<<i[2]<<std::endl;
        }
    }
}

правда все равно надо добавлять в Interface хотя бы виртуальный деструктор. Его правда полюбому надо добавлять, т.к. такой вектор не то что вывести, его и удалить нормально нельзя.

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


Эксперт
****


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

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



korian, удалить можно... А вот dynamic_cast (как, впрочем, и typeid) вряд ли работать будет без vtable...
Думаю, задача действительно не имеет решения.
PM   Вверх
mes
Дата 22.3.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(korian @  22.3.2008,  18:30 Найти цитируемый пост)
std::string str = typeid(*(*iter)).name();

у меня при исполнении этой строчки кода  str  == "9Interface"


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



удалить то можно, я в то смысле, что деструкторы вызываться не будут для Struct-ов.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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