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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив разных объектов-наследников (pointers?), тип заранее не известен, чтение из файла 
V
    Опции темы
Andrew121
Дата 17.7.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Прошу прощения за оффтоп.
В этом: http://forum.vingrad.ru/index.php?showtopi...t&p=1923072 посте я насчитал 13 смайликов. Значит довольна. Не зря старались smile 
PM MAIL   Вверх
Леопольд
Дата 17.7.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 16.7.2009,  21:42)
Цитата(Леопольд @  16.7.2009,  19:51 Найти цитируемый пост)
Если она только "плодит" объекты, то вроде нет проблем...

Проблема есть. Поищи в гугле std::map thread safety issues.

Проблема в том что map можно менять, при этом, например, все итераторы, которые уже на что-то указывают, становятся невалидными. Можно доработать эту фабрику так, что-бы она работала безопасно с точки зрения многопоточности, не меняя внешнего интерфейса. Но здесь это точно ни к чему, как и singleton. Я упомянул о нём, для того что бы показать что может быть некоторое количество проектных решений одной и той же задачи. После освоения С++ классов, стоит уделить внимание ООП. Сам С++ только предоставляет свои средства для этого. Я в своё время не придавал этому особого значения, а зря, потому что понимая ООП, перестаешь просто пользоваться классами, полиморфизмом и т.п. а начинаешь использовать возможности языка целенаправленно, заранее спроектировав систему. Насколько я вижу, KasMP сначала кодирует, а потом уже пытается сложить все части вместе. Наоборот, сложнее, но гораздо эффективнее. Книжка GoF невелика и читается легко (как мне показалось). Я прочёл её за две недели, а она перевернула мое представление о том как надо создавать программы.

Касательно многопоточности:
Насколько я понимаю, проблема может быть только с разделяемыми сущностями, которые реагируют изменением состояния на действия пользователя. Т.е. можно получить совсем не то что ожидалось, потому что состояние сущности было изменено другим потоком. С другой стороны, этим можно воспользоваться в своих целях -  мьютексы, семафоры, локеры...
А если объект не меняет своего состояния за время жизни, то он безопасен.

Добавлено @ 09:26
Цитата(azesmcar @ 17.7.2009,  08:53)
Ну, о шаблонах в книгах для новичков практически ничего не написано.

По шаблонам, и их возможностям на сегодняшний день, есть книжка "Шаблоны С++. Справочник разработчика" 538 стр. А5
Как раз её я сейчас прочёл наполовину smile

Это сообщение отредактировал(а) Леопольд - 17.7.2009, 09:27


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  17.7.2009,  09:21 Найти цитируемый пост)
Можно доработать эту фабрику так, что-бы она работала безопасно с точки зрения многопоточности

зачем? если можно просто не делать ее синглтоном smile 

Цитата(Леопольд @  17.7.2009,  09:21 Найти цитируемый пост)
А если объект не меняет своего состояния за время жизни, то он безопасен.

потоко-безопасен. Ответ: скорее всего - да, (в общем случае - нет). Речь идет о контейнерах STL, а thread safety guarantee STL контейнеры не дают. Надо смотреть доки конкретной реализации STL. Гарантию на потоко-безопасное чтение дает реализация STL от SGI. В общем случае - такой гарантии нет.
PM   Вверх
Леопольд
Дата 17.7.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 17.7.2009,  09:38)
Цитата(Леопольд @  17.7.2009,  09:21 Найти цитируемый пост)
Можно доработать эту фабрику так, что-бы она работала безопасно с точки зрения многопоточности

зачем? если можно просто не делать ее синглтоном smile

5000 потоков могу использовать одну, разделяемую, фабрику. 
Кстати, можно ли её вынести в динамически подключаемую либу? Я с этим не разбирался, и не знаю, как шарится память между разными программами.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  17.7.2009,  09:49 Найти цитируемый пост)
Кстати, можно ли её вынести в динамически подключаемую либу? Я с этим не разбирался, и не знаю, как шарится память между разными программами

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

Цитата(Леопольд @  17.7.2009,  09:49 Найти цитируемый пост)
5000 потоков могу использовать одну, разделяемую, фабрику. 

чего?
PM   Вверх
Леопольд
Дата 17.7.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 17.7.2009,  09:53)
нет, нельзя, шаблонные классы в динамическую библиотеку не помещаются.

А если она будет не шаблонная?


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  17.7.2009,  09:59 Найти цитируемый пост)
А если она будет не шаблонная? 

можно
PM   Вверх
Леопольд
Дата 17.7.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 17.7.2009,  09:53)
Цитата(Леопольд @  17.7.2009,  09:49 Найти цитируемый пост)
5000 потоков могу использовать одну, разделяемую, фабрику. 

чего?

Цифра, конечно, нереальная, для обычных ситуаций smile

Например, нам надо порождать ISUP сообщения, а каждое соединение обрабатывается в отдельном потоке. Я работаю, в основном, с MSC (Mobile Switching Center)  smile 

Это сообщение отредактировал(а) Леопольд - 17.7.2009, 10:37


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 17.7.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @ 17.7.2009,  09:21)
По шаблонам, и их возможностям на сегодняшний день, есть книжка "Шаблоны С++. Справочник разработчика" 538 стр. А5
Как раз её я сейчас прочёл наполовину smile

Что они творят! Вот пример, из книги, немножко переделан, для наглядности:

Код

#include <iostream>

template <typename Base, int D>
class Discriminator: public Base{
};
template <typename Setter1, typename Setter2,
          typename Setter3>
class PolicySelector: public Discriminator<Setter1,1>,
                      public Discriminator<Setter2,2>,
                      public Discriminator<Setter3,3>{
};

struct DefaultPolicy1{
    static void func(void){ std::cout<<"DefaultPolicy1"<<std::endl; }
}; 
struct DefaultPolicy2{
    static void func(void){ std::cout<<"DefaultPolicy2"<<std::endl; }
}; 
struct DefaultPolicy3{
    static void func(void){ std::cout<<"DefaultPolicy3"<<std::endl; }
}; 
struct DefaultPolicies{
    typedef DefaultPolicy1 P1;
    typedef DefaultPolicy2 P2;
    typedef DefaultPolicy3 P3;
};
class DefaultPolicyArgs: virtual public DefaultPolicies{
};

template <typename PolicySetter1 = DefaultPolicyArgs,
          typename PolicySetter2 = DefaultPolicyArgs,
          typename PolicySetter3 = DefaultPolicyArgs>
class TemplateWhithUnorderedPolicies{
    typedef PolicySelector <PolicySetter1, PolicySetter2,
                            PolicySetter3>
            Policies;
public:
    static void Call(void){
        Policies::P1::func();
        Policies::P2::func();
        Policies::P3::func();
    }
};

template <typename Policy>
struct Policy1_is: virtual public DefaultPolicies{
    typedef Policy P1;
};

template <typename Policy>
struct Policy2_is: virtual public DefaultPolicies{
    typedef Policy P2;
};

template <typename Policy>
struct Policy3_is: virtual public DefaultPolicies{
    typedef Policy P3;
};


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

struct CustomPolicy{
    static void func(void){
        std::cout<<"CustomPolicy"<<std::endl;
    }
};

int main(int argc, char* argv[])
{
    TemplateWhithUnorderedPolicies<Policy2_is<CustomPolicy> >::Call();
    return 0;
}




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


uploading...
****


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

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



Цитата(Леопольд @  17.7.2009,  16:10 Найти цитируемый пост)
Что они творят! Вот пример, из книги, немножко переделан, для наглядности:

ну и что они творят?
PM   Вверх
Леопольд
Дата 17.7.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 17.7.2009,  16:12)
Цитата(Леопольд @  17.7.2009,  16:10 Найти цитируемый пост)
Что они творят! Вот пример, из книги, немножко переделан, для наглядности:

ну и что они творят?

Можно задавать параметры шаблона в любом порядке, при этом остальные останутся по умолчанию. Я был впечатлён. Настолько, что решил поделиться smile и забыл объяснить...

Код

   TemplateWhithUnorderedPolicies<Policy3_is<CustomPolicy>, Policy1_is<CustomPolicy> >::Call();


Это сообщение отредактировал(а) Леопольд - 17.7.2009, 16:33


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
KasMP
Дата 18.7.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  17.7.2009,  08:02 Найти цитируемый пост)
еще есть boost::serialization - готовый к использованию сериализатор\десериализатор с различными форматтерами (простой для использования) раз пошла такая пьянка ....может стоит взглянуть на него. 

Спасибо, учтем на будущее smile .
Цитата(Леопольд @  17.7.2009,  08:19 Найти цитируемый пост)
Мне надо "общаться" только в трезвом состоянии. А то бываю черезчур резок, если спровоцирвать... 

smile
Цитата(azesmcar @  17.7.2009,  08:53 Найти цитируемый пост)
Добавил комментарии (в первом посте). Надеюсь поможет (с английским хорошо?), если что - спрашивайте, не стесняйтесь. 

smile smile. Ваши ценные комментарии я вполне понимаю.
Вопросов пока нет - я пыталась сделать все это более простым способом smile.
Цитата(azesmcar @  17.7.2009,  08:53 Найти цитируемый пост)
Ну, о шаблонах в книгах для новичков практически ничего не написано. 

Ну, в ней есть главы и про шаблоны, и про STL... Хотя не исключено, что для вас это будет "практически ничего" smile .
Цитата(azesmcar @  17.7.2009,  08:53 Найти цитируемый пост)
чтобы глаза не мозолить лишними страницами кода

Посмотрим smile . Спасибо за все хорошее smile smile .
Цитата(Andrew121 @  17.7.2009,  09:01 Найти цитируемый пост)
Прошу прощения за оффтоп.
В этом: http://forum.vingrad.ru/index.php?showtopi...t&p=1923072 посте я насчитал 13 смайликов. Значит довольна. Не зря старались

 smile Ты очень наблюдателен smile smile !
______________________________________________

Пусть есть полиморфный класс Base и производные от него Der, Der1 и Der2. Я хочу уметь приводить переменные типа Base* к типу Der*, Der1* или Der2*.
"Более простой" способ имеет 2 основные составляющие:
  • Base* factory()
    Каким-то способом функция узнает, какой именно объект-наследник от нее хотят получить, и возвращает указатель на него. Например, как-то так:
    Код

    Base* factory (char i) {
     switch (i) {
      case '0': return new Der;
      case '1': return new Der1;
      case '2': return new Der2;
     }
    return 0;
    }

    Здесь вроде как функция должна вернуть указатель соответствующего типа.
  • Если p типа Base* действительно ссылается на объект типа Der, то dynamic_cast может привести p к Der*.
    Как-то так:
    Код

    int main() {
     Base *bp;
     Der *dp, d_ob;

     bp = &d_ob; // bp ссылается на Der
     dp = dynamic_cast <Der*> (bp);

    И вот после этого якобы приведение должно пройти успешно.

Но у меня все совсем по-другому:
На строках типа
Код
  case '1': return new Der;
 и 
Код
bp = &d_ob;
 возникает ошибка
Цитата(VS 2008 Express Edition)

1>... : error C2243: 'type cast' : conversion from 'Der *' to 'Base *' exists, but is inaccessible

smile smile smile
PM MAIL   Вверх
azesmcar
Дата 19.7.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(KasMP @  18.7.2009,  22:57 Найти цитируемый пост)
1>... : error C2243: 'type cast' : conversion from 'Der *' to 'Base *' exists, but is inaccessible

Скорее всего результат приватного наследования.
Код

class A {}
class B : A {}; //это приватное наследование, эквивалентно class B : private A {};

надо заменить на
Код

class A {}
class B : public A {};


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


Шустрый
*


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

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



а можно попросить пример с boost::serialization?
в моей программе как раз буст нужно использовать.
И.... как подключить boost к MSVC ?
PM MAIL ICQ   Вверх
azesmcar
Дата 19.7.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(GrishinUS @  19.7.2009,  15:08 Найти цитируемый пост)
а можно попросить пример с boost::serialization?

http://www.boost.org/doc/libs/1_38_0/libs/...xample/demo.cpp
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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