Котинг
-
-
Чего ты именно хочешь? Приведи конкретный пример.
А ещё сюда скоро набегут плюсоненавистники. -
йцйцйц
-
Паттерн называется Singleton.
class CSingleton {public:static CSingleton& Instance(){static CSingleton self;return self;}private:CSingleton() {} // Private constructor~CSingleton() {}CSingleton(const CSingleton&); // Prevent copy-constructionCSingleton& operator=(const CSingleton&); // Prevent assignment}; -
Кстати, как сделать хороший Singleton, описывается у Александреску и потом все сведено в библиотеку man Loki.
-
Получаешь экземпляр класса как CSingleton::Instance().
(Этот код НЕ thread-safe) -
Скажите, плюсоводы, а чтобы более-менее разбираться в паттернах, это нужно от корки до корки прочитать "Паттерны проектирования"? Или есть какие-нибудь статьи, в которых всё расписано просто и на пальцах?
-
Во-первых, эти штуки применяются не только в плюсах.
Во-вторых, есть какие-нибудь статьи, в которых все расписано просто и на пальцах*.
В-третьих, слишком углубленное понимание паттернов засоряет мозг и мешает писать код. Вместо работающего кода ты начнешь писать паттерны. А даже самые лучше маркетологи еще не придумали способа продавать паттерны за деньги, грусняво, да.* http://habrahabr.ru/blogs/comple
te_code/ -
Нет, понятное дело, что писать паттерны, развешивать везде многоуровневые иерархии и, грубо говоря, деревьями заслонять лес, не есть хорошо и даже есть плохо. Но прокачать этот навык стоит хотя бы для того, чтобы понимать, что имеется в виду, когда небрежно пишут "а вот эту хуйню мы реализуем с помощью паттерна Итератор и больше не будем на неё отвлекаться ".
Вот, кстати, взялся наконец-то Страуструповский С++ читать. Хорошо читается, зараза. -
Джеффа Элджера «C++» еще прочти, эпичная книга. Не такое насилие мозга как Александреску, очень умно и по делу.
-
>насилие мозга как Александреску
Александреску, кстати, тоже легко и интересно читается. Просто он использует язык нестандартным и неоднозначным образом, потому и идет с трудом. Чтобы получать удовольствие от необычной шаблонной магии, нужно уметь обращаться с шаблонами чуть сложнее, чем std::vector<int>, тогда изучение модерн цпп дизайна будет проходить модно, весело и спортивно, я гарантирую это. -
Да я читал. Спать потом не мог.
Жаль, что на практике все это волшебство не используется почти совсем. -
Спасибо, анон, скачал. После первого прочтения Страуструпа возьмусь за Элджера.
-
-
Почему же, можно книжки писать, вполне себе за деньги.
-
А еще можно коучем успеха стать, например.
Или тренинги по пикапу проводить. -
С применением паттернов проектирования? Тренинги по пикапу? Неплохая идея.
-
Барышни есть разные. Иная, услышав, что ты осилил, к примеру, Александреску и в проектах вовсю обмазываешься паттернами - сразу раздвинет ноги. Да-да.
-
Алёна C++, объект оголтелого фапа в геймдевелоперском сообществе.
Правда, это старая фоточка, щас Алёнушка стала жирная и некрасивая.
-
Не рекомендую такую барышню :3
-
Все, я больше не могу с ним воевать.
loader.h://инклуд всяких стандартовclass Loader{public:static Loader loader;SDL_Surface* LoadImage( std::string );template< class T >bool LoadConfig( std::string, vector< T>* );};loader.cpp:
include loader.hLoader Loader::loader;//blahblahtemplate< class T >bool Loader::LoadConfig( std::string filename, vector< T > *pvec ){return true; //просто затычка.}another.cpp
void somefunction(){vector<SomeStruct> pvec;Loader::loader.LoadConfig( "somestring", &pvec );}another.cpp:3: undefined reference to `bool Loader::LoadConfig<SomeStruct>(s
td::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<SomeStruct, std::allocator<SomeStruct> >*)'
collect2: выполнение ld завершилось с кодом возврата 1Анон, я же делаю какую-то мелкую глупую ошибку? Где она?
-
Линкер не может найти тело LoadConfig.
Перенеси весь код твоего шаблона в заголовочный файл. И если что, выкладывай код ошибки, а не её описание. -
И правда. Только как теперь быть? В эту функцию нужно кучу всего поместить. писать все в заголовке? Вдобавок, если в теле функции появляется хотя бы одна скобка, то компилятор сходит с ума и начинает ругаться на ) в заголовке функции, а если оно еще и в теле, то вообще неожиданные ошибки возникают, типа
main.cpp:100: ошибка: недопустимая декларация элемента-функции ‘Loader::Main::MouseMoved’ внутри ‘Loader’Код ошибки это make: *** [Projectname] Ошибка 1?
Кроме этого еще говорит верхнюю функцию, в которой произошел фейл. больше ничего дельного не говорит. Может у меня какой-то неправильный g++? -
Можно показать шаблону, с чем он будет работать.
.cpp:
bool Loader<SomeStruct>::LoadConfig( std::string filename, vector< T > *pvec )
Только если будешь использовать что-то кроме SomeStruct, ты должен будешь это тоже добавить в .цпп>>Код ошибки это make: *** [Projectname] Ошибка 1?
Сорри, я думал ты со студией работаешь. -
Зачем тогда шаблон, если все равно придется писать 9000 функций под каждый структ? Чтобы сэкономить 3 строки на вызовах?
-
Все нормальные разработчики реализуют шаблоны в заголовочных файлах.
Тогда можно будет и inline заюзать
>>Чтобы сэкономить 3 строки на вызовах?
Использование шаблонов не сокращает объём генерируемого компилятором кода. -
>Использование шаблонов не сокращает объём генерируемого компилятором кода.
Зато позволяет разработчику писать код других мест, а не заниматься нажиманием ctrl+c ctrl+v
Думаю все-таки отказаться здесь от шаблонов и банально написать 9000 одинаковых функций. Количество разных типов все равно планирую не очень большое -
Тогда есть смысл заюзать ООП.
Сделать интерфейс Loader и интерфейс SomeStruct, и от них плясать. -
Если абстрагироваться от изначальной проблемы, я конфиги делал бы на каком-то скриптовом языке сразу. Тогда и много одинаковых структур не надо, по-идее.
-
Зойчем ты предлагаешь аффтору заморачиваться лишний раз? Не уточнив применения конфига, можно предлагать только ini или какой-нибудь там джейсон. Тащить за собой целый скриптовый движок, чтобы загружать словари "ключ-значение"? Сделайте развидеть.
Алсо, луа — язык не для людей, но это к теме не относится, извините, не удержался.
-
Я сделал все на няшном ямле, и все даже уже рабоает. Правда парсятся пока только строки, и решение тяжеловато, но все в 2,5 функции.
-
Ямл малаца, одобряю.
>Правда парсятся пока только строки
>пока
Ты сам писал парсер штоле? Но зачем?А что ты вообще сочиняешь там?
-
Нет, ямл-цпп приделал. Вот только он по дефолту работает очень статично, я пытаюсь добавить динамики.
-
Игрушку по юккурям же. Там внизу >>4288 исходники.
-
Конфиги на Lua, открытое API и пусть пользователь сам ебётся, как хочет, лол.
-
Именно.
-
>а если оно еще и в теле
Если функция распологается в хеадерах. Совсем не соображаю что пишу уже. -
Попробуй явно указать специализацию функции.
Loader::loader.LoadConfig<SomeStruct>("", &pvec); Или запили куда-нибудь исходники, которые можно компилировать и умиляться (лень додумывать, что там еще было).
-
Не помогает. В общем, суть такова:
Есть разные конфиги, под каждый свой структ. another создает вектор структов одного типа и отправляется в loader, где вектор наполняется распарсенными конфигами одного типа. Чтобы не писать по функции на каждый тип конфига пытаюсь заменить это шаблонами. -
А запилить исходники?
-
Ох, там много, а коммитить нерабочую версию не хочется.
http://paste2.org/p/793600. Как-то так. Там 5 файлов. Вызывается все это добро: Config::conf.LoadEntities(); -
Что-то мне пришло в голову. Покажи, как ты собираешь проект; возможно, ты делаешь это неправильно.
-
http://svn.xp-dev.com/svn/Yukkur
i/branches/cpp/
Мейкфайл + ямл-мейкфайл ниже. -
В какой-то книжке вычитал, что vector<ClassName> при дбавлении элементов и отсуствии места в векторе будет при расширении вызывать конструктор и деструктор ClassName. Т.е. если у меня есть вектор с 10 объектами класса, и в одном из объектов я поменял какое-то свойство, то при добавлении еще n объектов в вектор, я рискую потерять все изменения предыдущих объектов?
Чисто теоретический интерес, естественно, что лучше использовать vector<ClassName*>. -
Странная какая-то книжка.
>конструктор и деструктор ClassName
Нет такого не происходит.
>естественно, что лучше использовать vector<ClassName*>
Плохая идея, лол. При перераспределении памяти может оказаться, что твои указатели указывают на произвольные места в памяти. (Страуструп, Язык программирования С++, §16.3.8).
Вообще использовать vector не как статический массив мысль плохая. ADS для кого придумали?
Купи себе Страуструпа и всегда держи под рукой. -
Вообще на плюсах писать мысль плохая.
-
Да, питон-янемогунормальноскомпилиро
ватьсяводинфалй, конечно, лучше. -
какой другой интерпитируемый язык может?
-
Perl.
-
Haskell to the rescue!
trollface.jpg -
>Нет такого не происходит.
Нет, происходит. При наличии в ClassName нормальных копи-кторов ничего никуда не потеряется же. Другое дело, что это может оказаться медленным дохуя.
>При перераспределении памяти
Что такое перераспределение памяти и куда денутся мои данные, случись оно?
Статический массив - это ClassName a[N]; зачем здесь вектор? -
А я вот задумался, что лучше:
pair< int, int> twoint или int toint[2]. По идее статический массив лучше. Или пару лучше использовать, только на разнотипных значениях? -
Массив лучше, потому что проще.

