1876
|
Программирование / С/C++ / Re: работа с шаблонным классом
|
: Октябрь 03, 2010, 17:16
|
"Тело" template ф-ции должно быть "в той же единице транслятора". Если Вы перенесете его из myclass.cpp в myclass.h, то линкер его найдет. Я обычно собираю тела template в еще одном h файле (напр. myclass_template.h) и в конце myclass.h пишу #include "myclass_template.h". А то myclass.h получается очень замусоренным (на мой вкус). Неправда) ошибка здесь: C++ (Qt) template <class S> void myclass::login(S login, S pass) { additional_func->connect(login,pass); } а надо так: C++ (Qt) template <class S> void myclass<S>::login(S login, S pass) { additional_func->connect(login,pass); }
Ну и конечно, лучше по константной ссылке передавать значения.
|
|
|
1878
|
Разное / Говорилка / Re: Задачки
|
: Октябрь 03, 2010, 00:40
|
Как то у нас проходила неделя французского кино и меня вытащили на один из фильмов, названия не помню, но запомнилась одна игра) Суть игры следующая: Играют двое. Имеется 4 ряда (пусть будет спичек, хотя не важно чего, но в фильме это были спички), причём в первом ряду одна спичка, во втором 3 спички, в третьем 5 спичек и в четвёртом 7 спичек (типа пирамидка). Каждый игрок за один ход может взять любое число спичек, но только с одного ряда. Затем ходит второй и тож может взять любое число спичек но только с одного какого-либо ряда. Проигрывает тот, кто забирает последнюю спичку.
Хочу написать маленькую програмку, и пока в основной проге проходят расчёты (считает долго) позабавить тем самым пользователя))
Подскажите как енто лучше сделать))
|
|
|
1881
|
Программирование / Алгоритмы / Re: Упаковка массива
|
: Сентябрь 18, 2010, 14:49
|
Извиняйте, но это вообще бредовая идея определять оператор неравенства для такого объекта, как Point2D
Определяете сетку на плоскости и считаете сколько точек попало в каждую ячейку. Вместо тех точек, которые находятся в некоторой ячейки ставите одну с координатами их центра масс. Самое логичное решение, на мой взгляд. В итоге у вас получится столько точек, сколько было ячеек. Единственное что, сетку можно по-разному определить, но эт уже детали.
|
|
|
1882
|
Программирование / С/C++ / Re: перегрузка оператора + (комплексные числа)
|
: Сентябрь 17, 2010, 17:33
|
в первом случае ошибка error: invalid operands of types `Complex*' and `Complex*' to binary `operator+' во втором C:/Qt/2009.03/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h:(.text$_ZN7ComplexplES_[Complex::operator+:-1: error: undefined reference to `Complex::Complex()'
Ошибка из-за того, что не определён конструктор по умолчанию (он у вас просто объявлен, как и деструктор). Надо хотя бы сделать так: C++ (Qt) public: Complex() {} ~Complex() {} ...
А это, Complex operator+(Complex a) // перегрузка оператора { Complex rez; rez.im =im +a.im; rez.re = re+ a.re; return rez; }
ваще жесть) Не пишите так) Или прочитайте литературу перед тем как воять подобное) И кстати, есть уже готовое решение для класса комплексных чисел (так и называется complex) пример: C++ (Qt) #include <complex> #include <iostream> using namespace std; int main() { complex<double> c1(1.0, 2.0); complex<double> c2 = c1; c2 += 1.0; cout << c1 << endl; cout << c2 << endl; return 0; }
Вот описание этого класса: http://www.cplusplus.com/reference/std/complex/
|
|
|
1883
|
Qt / Общие вопросы / Re: QStringList
|
: Сентябрь 14, 2010, 13:08
|
Так быстрее?) К тому же, если имя, отличное от d_* или s_*, занесется в d_table.
Ну если вопрос ставился изначально, что все имена начинаются либо с s либо с d, то быстрее) Лучше конечно сравнивать с первым символом. for (int i = 0; i < i1.count() - 1; i++) { QString string = i1; if (string.contains("s_")) s_tables.push_back(string); if (string.contains("d_")) d_tables.push_back(string); }
А в Вашем варианте вы не до конца проходите список. И более того, если у вас прошло первое условие: if (string.contains("s_")) s_tables.push_back(string); то всё равно повторно будет произведён поиск на "d_". Зачем? C++ (Qt) foreach (QString str, i1) { if (str[0]=='s') s_table << str; else if (str[0]=='d') d_table << str; }
|
|
|
1884
|
Qt / Общие вопросы / Re: QStringList
|
: Сентябрь 14, 2010, 13:01
|
"d_s_"
тогда так: C++ (Qt) foreach (QString str, i1) { if (str[0]=='s') s_table << str; else d_table << str; }
|
|
|
1885
|
Qt / Общие вопросы / Re: QStringList
|
: Сентябрь 14, 2010, 12:51
|
C++ (Qt) foreach (QString str, i1) { if (str.contains("s_")) s_table << str; else d_table << str; }
|
|
|
1887
|
Qt / Кладовая готовых решений / Re: Переходничок
|
: Сентябрь 12, 2010, 15:31
|
А почему handleEvent осведомлен о классе CMeshCalculator вообще? Откуда handleEvent знает какой текст нужно написать и какой прогресс показать? И если у Вас 2 или более обсерверов, откуда они знают кому чего показать?
Ну тут меня опередили (см. выше) Я так вижу что ресурсы-то уже тратятся (STL и.т.п) а хотя бы минимальной ф-циональности еще нет.
Igors, это уже жадность)) Что там такого тратиться? Не думаю, что кто то вообще почувствует разницу по съеданию ресурсов в этом месте.. Короче это смешно) А по-поводу минимальной функциональности это Вы не правы. В данном конкретном примере, целью которого было лишь продемонстрировать идею этого патерна, реальной функциональности нет) Эт ж пример)) Но, если смотреть глубже то здесь большой потенциал, для Вашей задумки с переходником. Причём реализуется он без лишних беспокойств Санька, (того, который так хорошо кладёт код) Чем по функциональности приведённый пример с патерном уступает вашему переходнику?
|
|
|
1888
|
Qt / Кладовая готовых решений / Re: Переходничок
|
: Сентябрь 11, 2010, 17:14
|
Интриги, скандалы, расследования! ![Смеющийся](http://prog.org.ru/forum/Smileys/default/grin.gif) Почитал я на досуге про патерн Observe ![Улыбающийся](http://prog.org.ru/forum/Smileys/default/smiley.gif) и это реально более изящное и правильное решение на мой взгляд. Используя этот патерн, Ваш пример с CMeshCalculator выглядел бы следующим образом: C++ (Qt) #ifndef CMESHCALCULATOR_H #define CMESHCALCULATOR_H #include <list> class CMeshCalculator; class IObserver { public: virtual void handleEvent(const CMeshCalculator &) = 0; }; class CMeshCalculator { public: CMeshCalculator() :_someParam(0) {} int someParam() const { return _someParam; } void calculate() { // Possible here _someParam is changed. // for example: _someParam++; notify(); // ... } void reg(IObserver &ref) { _observers.push_back(&ref); } void unreg(IObserver &ref) { _observers.remove(&ref); } private: std::list<IObserver*> _observers; typedef std::list<IObserver*>::iterator _iterator; void notify() { for(_iterator it = _observers.begin(); it != _observers.end(); it++) (*it)->handleEvent(*this); } int _someParam; }; #endif // CMESHCALCULATOR_H
Где мы сотворили чисто виртуальный класс IObserve. Функция calculate() - это то, где производятся громоздкие расчёты и т.п. И в ней мы вызываем notify(), которая перебирает список всех зарегистрированных наблюдателей и вызывает у каждого переопределённый метод handleEvent. Теперь пример класса TextProgressIndicatorObserver: C++ (Qt) #ifndef TEXTPROGRESSINDICATOROBSERVER_H #define TEXTPROGRESSINDICATOROBSERVER_H #include <iostream> #include "CMeshCalculator.h" class TextProgressIndicatorObserver : public IObserver { public: void handleEvent(const CMeshCalculator &calc) { std::cout << "processing..." << std::endl; std::cout << calc.someParam() << std::endl; } }; #endif // TEXTPROGRESSINDICATOROBSERVER_H Разумеется, информацию мы можем выводить не только в cout но в гуй и куда угодно. И это решение - как раз и отделяет интерфейсную часть от расчётной -> переходничок) А используется это так: C++ (Qt) #include <iostream> #include "CMeshCalculator.h" #include "TextProgressIndicatorObserver.h" using namespace std; int main() { TextProgressIndicatorObserver tpiObserver; CMeshCalculator calc; calc.reg(tpiObserver); calc.calculate(); return 0; }
Поправьте, если чего то не того написал)) References: http://en.wikipedia.org/wiki/Observer_pattern
|
|
|
1889
|
Qt / Кладовая готовых решений / Re: Кладовка готовых решений
|
: Сентябрь 06, 2010, 00:02
|
История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.
Присоединяюсь) История повторяется, что и для раздела "Секреты и интересные возможности Qt" на crossplatform.ru. Судя по тому, что в подобных разделах пишут 2-3 человека, то лучше пусть пишут хотя бы что-то. Иногда в полном хламе можно найти интересную идею, которую нужно просто развить.
Я квалифицирую такие посты как "ординарный/банальный цинизм". Вероятно молодой человек испытывает кризис, жизнь кажется ему исключительно "в оттенках черного" (возможно проблемы с девушкой) и.т.п. Это бывает - и это проходит
А причём здесь цинизм? Вероятно, если тот, о ком Вы это написали испытывал подобные проблемы, и аж видел жизнь искл. в оттенках чёрного, он едва, на мой взгляд, постил бы здесь с таким энтузиазмом) Скорее депрессировал где-нить на кладбище с собратьями по мировоззрению) А может создать на форуме, если на то пошло, отдельную тему, типа: психологическая помощь или тема доверия для потерянных больных первертов в мировой Qt-тусовке?)) Igors мог бы быть там модератором)) ![Подмигивающий](http://prog.org.ru/forum/Smileys/default/wink.gif)
|
|
|
1890
|
Программирование / С/C++ / Re: операторы для ARGB
|
: Сентябрь 04, 2010, 19:21
|
Отсутствует Ассоциативность, а не Коммутативность С1+С2+С3 != С2+С3+С1 Но поскольку имеем Ассоциативность, то С1+С2 == C2+C1 => (С1+С2)+С3 == (C2+C1)+C3 равносильно такой записи С1+С2+С3 == C2+C1+C3
И в чём тогда проблема? Или я чего-то не вкуриваю..
|
|
|
|
|