Russian Qt Forum
Март 29, 2024, 11:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 116 117 [118] 119 120 ... 140
1756  Программирование / С/C++ / Re: Возврат ссылки : Март 11, 2011, 18:48
А смысыл в try, catch внутри функции??
Уж тогда так:
Код
C++ (Qt)
AccountAutorizationData* const& AccountModel::referenceToData(int row) const throw(Error_exeption)
{
       if (isIdFromDiapazon(row))
           return modelInternalVector.at(row);
 
       throw Error_exeption("Row not from diapazon in AccountAutorizationData*"
                   " const& AccountModel::referenceToData()");
}
 
1757  Qt / Общие вопросы / Re: Наследование от QList. : Март 10, 2011, 17:18
по второму вопросу можно узнать ответ, прочитав каменты по той ссылке, что приведена перед фрагментом кода
Ясненько)
1758  Qt / Общие вопросы / Re: Наследование от QList. : Март 10, 2011, 17:02
Вот здесь я делаю такой изврат:
http://qtcoder.blogspot.com/2010/02/directmap-map.html

Код
C++ (Qt)
template <class Key, class Value>
class DirectMap : private QList<QPair<Key, Value> >
{
public:
 //! Добавляем пару
 void append(const Key &, const Value &);
 //! Список ключей
 QList<Key> keys() const;
 //!
 Value operator[](const Key & key) const;
};
 
 
 

А зачем дублировать информацию о ключах, ведь её можно извлечь из  QList<QPair<Key, Value> >?
И почему просто не воспользоваться QMap?

Ой, совсем брежу)) QList - эт ж не член)) Первый вопрос решён))
1759  Qt / Кладовая готовых решений / Re: Частный случай механизма сигнал-слот : Март 10, 2011, 14:31
Вышла версия libssc-4

Качественно изменена архитектура, что позволяе достаточно просто расширять функционал до любого числа передоваемых параметров в сигнале.

Пока ограничился случаем с числом параметров 2.
Поддерживается не неполное совпадение прототипа, т.е можно соединять:
signal<int, int> например со слотом func(float, float) и т. д.
Число параметров сигнала должно совпадать с числом параметров слота.

пример:
Код
C++ (Qt)
#include <iostream>
#include "signal_slot.h"
#include <cmath>
 
using namespace std;
 
class A
{
public:
   ssc::signal<void> sig_a0;
   ssc::signal<int> sig_a1;
   ssc::signal<int, float> sig_a2;
 
   void run() const {
       sig_a0();
       sig_a1(123);
       sig_a2(4, 2.5);
   }
};
 
class B : public ssc::trackable
{
public:
 
   void slot_b0() {
       cout << "slot_b0" << endl;
   }
 
   void slot_b1(int x) {
       cout << "slot_b1, x = " << x << endl;
   }
 
   double slot_b2(double x, float y) {
       double res = pow(x, y);
       cout << "slot_b2, x^y = " << res <<  endl;
       return res;
   }
};
 
 
int main()
{
   A a;
   B b;
 
   a.sig_a0.connect(&b, &B::slot_b0);
   a.sig_a1.connect(&b, &B::slot_b1);
   a.sig_a2.connect(&b, &B::slot_b2);
 
   a.run();
 
   return 0;
}
 

  
1760  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 10, 2011, 12:32
Однако у меня такое исключено, поскольку перед закрытыми переменными ставлю _

не рекомендуется стандартом, имена с _ и __ зараезервированы для стандартной библиотеки. Поля класса называю на m, типа m_name. Некоторые ставят _ в конце имени: name_. ИМХО любой способ лучше, чем this->.

Согласен с brankovic, ставлю после имени _. Перед именем не рекомендуют ставить _ из-за возможной коллизии имен с макросами.

Вот ведь, век живи - век учись)) Всё, перехожу обратно на m_
1761  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 10, 2011, 11:10
Или, как указал _govorilka , сделать toString методом базового класса тогда вместо ветвистого else всего одна проверка
Код
C++ (Qt)
const BaseClass * base = dynamic_cast<const BaseClass *> (dt); // возможно и это не нужно
if (base)
  str = base->toString();
 
Пусть не критично/обязательно, но в этом есть смысл.
Так даже более того, не нужно будет делать никакого приведения, поскольку toString() будет относится к интерфейсу.
1762  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 10, 2011, 11:04
ИМХО, ненужное засорение кода.
Я тож так не пишу, но
Могу привести одну ситуацию, где так писать целесообразно:
Например у нас есть некоторый класс, который имеет закрытую переменную, назовём её value:
Код
C++ (Qt)
class A
{
public:
   void setValue(int value) { this->value = value; }
private:
   int value;
}
 
 
Однако у меня такое исключено, поскольку перед закрытыми переменными ставлю _
1763  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 08, 2011, 18:47
Цитировать
Ну почему нехорошо? "pop" предполагает что ответственность за "снятый" элемент возьмет на себя кто-то другой, может и удалить, это нормально.
В смысле? Возвращает же функция не указатель...
Даже если бы и указатель, то delete dt порушит весь объект к чёрту..
Т.е. попробуйте вызвать эту функцию дважды PopNumeric() интересно, что получится)
1764  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 08, 2011, 18:10
brankovic, вот так бы сразу и сказали.  Подмигивающий Я, честно говоря, помню о работе с указателями, но что-то восприятие надо мной шутку сыграло.  Строит глазки Да, конструктор действительно оказался уже не нужен (в классе его убрал), а вот и та функция (пока она будет без  дополнительных проверок, это буду писать позднее), о которой вы говорили:

Код:
NNumeric NEngine::PopNumeric()
{
    NDataTypes* dt;
    NNumeric arg;
    dt = this->StackValue.pop();
    arg = *dynamic_cast<NNumeric*>(dt);
    delete dt;
    return arg;
}
А зачем здесь dt удалять?? Или так задумано, что при каждом вызове PopNumeric удалять очередной элемент в StackValue? Это не хорошо..
Короче полный даркнэсс, как говорит один мой знакомый)
1765  Разное / Говорилка / Re: Весь женский пол с 8 марта!!! : Март 08, 2011, 00:50
Присоединяюсь к Пантер'у и Admin'у  Подмигивающий

С праздником милые женщины) Пусть вас будет побольше на этом форуме))
 
Женщины созданы для того, чтобы их любили, а не для того, чтобы их понимали.
Оскар Уайльд

1766  Qt / Вопросы новичков / Re: Phonon и плеер : Март 07, 2011, 23:23
У меня под линем всё скомпилилось и работает)
Косяк не в коде..
Ищите)) Кто ищет - вынужден блуждать)
1767  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 07, 2011, 20:00
Не думаете ли Вы, что задуманная Вами архитектура единствена?
Я хочу сказать, что нужно учится выбирать правильные решения, а не решения, которые направлены на обход граблей.
Я тоже согласен с brankovic, что введение таких сомнительных операторов только запутывают логику и программу - это грабли, на которые кто-нить да наступит..

А можно, если не сложно, описать для чего всё это нужно и как по Вашему это всё работает и почему это должно быть именно так?
Вобщем описание проблемы не могли бы изложить?  
Единственная врятли, т.к. идея всегда одна, вариантов море. Надо только понимать, что выбрав один вариант, как основную линию, всегда практичней ее придерживаться, нежели брать обрывки из различных вариантов. Попытка взять все самое лучшее из других вариантов, по сути еще один вариант.  Подмигивающий

Насчет сомнительных операторов со "*", сомнения отпадают, когда приходится работать с указателями для хранения объектов, через базовые. Ситуации, где бы я мог передать указателю адрес из стека и рулить им в указателе на базовый класс я не встречал, а учитывая, что объект в программе используется только одним способом (вариантом), то для способов он не подходит. Полагаю, что именно абзацем ниже стоит объяснить почему.

Для начало повторюсь, что класс NNumeric (ровно как и другие) чисто хранит в себе значение и дополнительную информацию нужную движку-исполнителю. Который в свою очередь обеспечивает работу с такими типами данных, как NNumeric. Т.е. движок - это исполнитель входного кода в виде команд. Он осуществляет операции с экземплярами NNumeric и хранит из в виде указателей на базовый класс. Базовые классы используются не только для хранения, но для группирования классов по иерархии, т.к. есть классы сложнее NNumeric и использующие его для хранения чисел. Т.к. класс NNumeric используется для хранения и конструктор копирования по ссылке и также оператор присваивания по умолчанию копируют члены из экземпляра  одного в другой, то намного практичнее было сделать класс NNumeric именно принимающим значения, а не выполняющим переопределенные операторы для арифметики. Т.к. он спокойно может выдать свое значение с учетом типа, в который преобразуется. А дальше обычные действия. Т.к. в основном операции идут, через тип double и не могут пересечь ее границ (из-за границ установленных в классе, так и из-за границ самого типа float, т.к. получаем числа из файлов в виде 4 байт), то удобней применять его в качестве параметра автоматического конструктора и осуществлять контроль границ уже внутри класса. Сами типы float и qint32 также выдаются, но чисто для записи в файл или на вывод, но qint32 также используется в целочисленных операциях вместо double. Естественно для контроля целое/не целое есть _isreal, с помощью которого движок осуществляет правильное преобразование значений в нужный тип данных. Т.о. преобладает использование класса NNumeric  без указателя. Но, т.к. нигде не было встречено работы базовых классов с производными без указатели в СИ++, то необходимо использовать указатели на базовый класс. Но указатели на базовый класс приводятся к указателям на класс NNumeric, а переопределенные операторы (т.е. те, что имеют в классе) и работают с экземпляром NNumeric, а не указателем на класс NNumeric. Поэтому потребовалось сохранить работу с экземплярами NNumeric, а указатели использовать только чисто для хранения, но оперировать только лишь экземплярами NNumeric. Тем более, что передавая т.о., как описано в классе NNumeric мы не трогаем хранящиеся переменные, константные значения и временные переменные (хотя эти врятли, т.к. они попадают только в QStack). Т.к. при таком подходе обрывается связь с тем место, откуда был взят экземпляр, как если бы я работал через QVariant. А мне именно это и нужно, чтобы не затрагивать место хранения. С другой стороны, просто так указателю на класс не присвоишь экземпляр класса, т.к. работать с указателем ссылающимся на экземпляр класса объявленного не в куче, а в стеке вызывает очевидные проблемы. Следовательно, нужно по отдельно использовать все set функции для передачи хранящейся информации из экземпляра в указатель на класса, предварительно вызвав конструктор для указателя на класс. Этот указатель мы и сохраняем в указатель на базовый класс. Получается следующая ситуация, у нас много операций с экземплярами и нам придется повторить такое же кол-во раз, сколько и самих экземпляров используется, отсюда могут полезть ошибки и получится использование одного и того же кода два и более раз. Поэтому, практичнее сократить форму записи прописав все это в преобразование в NNumeric*, т.к. при наличии подобного переопределенного оператора он используется при попытке экземпляр класса присвоить указателю на этот класс или базовый для него. Т.о. мне практически ничего не надо было переписывать в функции матем. операций. Но одна сторона медали, а теперь другая. Т.к. для вывода и прочих операций опять используются только экземпляры класса NNumeric, то и здесь указатели не нужны. Но, хранится то у нас это все в указателях на базовый класс и даже после приведения к классу, это опять же указатель на класс, а нам нужны экземпляры. Опять же возникнет многократное вызывание функций set у класса NNumeric и опять тоже самое, что и в случае с передачей значений из указателя в экземпляр класса. Опять же все это прописываем в классе перегружая конструтор копирования, который по сути просто копирует значения, но внутри себя, и оператор присваивания, который по сути выполняет тоже самое. Но есть одно "но", однако здесь тоже самое, что и с конструктором копирования по ссылке и такому же оператору присвоения. Т.е. в одних случая идет присвоение, в других инициализация. Вот и получается, что таким переопределением определенных операторов и конструкторов я могу спокойно пользоваться экземплярами класса, а при передачи их в место хранения они сами выдадут указатель на класс созданный в куче, а не в стеке. А также при взятии из места хранения мне нет нужды исписывать километры строк для передачи значений в экземпляр класса. При этом не затрагивается как место хранения при работе с указателями, так и сами значения при выполнении операций над экземплярами класса. Говоря иначе, указатели для хранения с использованием базовых классов, ибо без указателей здесь никак.
Млин, я честно пречитал это раза три, но нифига не понял  Грустный
Лучше опишите суть задачи, которую Вы пытаетесь реализовать.. (как можно проще и понятнее, на пальцах можно сказать)
1768  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 07, 2011, 16:19
Не спорю, что всего заранее не предусмотреть. Но, "заложить фундамент" я понимаю как некий основной теор. минимум: как вообще другие с подобными проблемами справлялись, есть ли отточенные решения для этой ситуации, какие инструменты ит.д.
Хммм.. ну как сказать, "дело тонкое". Мне часто приходится делать задачи которые имеют аналоги, т.е. уже не раз делались. Но это совсем не Assistant где уже готовые/отточенные решения. Конечно, всегда хочется "прикрутить готовое" - но вот получается редко  Улыбающийся Смотришь - вроде исходники (часто open-source) грамотные, ладно, рискну. А через неделю-две начинаешь понимать что (несмотря на "формальную грамотность") программист тупенько передрал такую-то статью. А что оно работает "до первого милиционера", что никакие граничные случаи не отрабатываются, да и вообще сам алгоритм слабоват - так его это не волновало. Чтобы не быть голословным, вот примерчик (Вы templae любите)

http://www.csie.ntu.edu.tw/~cyy/courses/rendering/pbrt-2.00/html/octree_8h_source.html

Где с первого взгляда все гладко/хорошо - но это не так

Я бы не стал это использовать.. Я всегда с большим подозрением отношусь к подобным конструкциям:
Код
C++ (Qt)
template <typename NodeData> struct OctNode {
00037     OctNode() {
00038         for (int i = 0; i < 8; ++i)
00039             children[i] = NULL;
00040     }
00041     ~OctNode() {
00042         for (int i = 0; i < 8; ++i)
00043             delete children[i];
00044     }
00045     OctNode *children[8];
00046     vector<NodeData> data;
00047 };
 
Когда вот так просто открытые указатели объявляют..
Это не в традициях C++
хотя впрочем этот класс у них явно нигде не пресутствует.. Не знаю, тут разбираться надо..
Просто это первое, что в глаза попало..
1769  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 07, 2011, 16:10
Не спорю, что всего заранее не предусмотреть. Но, "заложить фундамент" я понимаю как некий основной теор. минимум: как вообще другие с подобными проблемами справлялись, есть ли отточенные решения для этой ситуации, какие инструменты ит.д.
И под архитектурой я вовсе не имею ввиду окончательный вариант, но некий интерплей между объектами, их обязанности,  иерархия, какие то свойства основные..
Короче, хотел выразить мысль, что картина вырисовывается не из-за понятий, а из взаимоотношений между ними.. Как то так))
К тому же, хуже от того, чтобы вначале подумать, взять листочек с ручкой, почеркать, походить, покурить точно не будет)  
(разве что от покурить)))
  
Я тоже продумываю все на листке бумаги, но всегда знаю, что может получиться криво. Ибо вначале, никак без этого, всегда где-нибудь не хватить знаний или опыта.  Подмигивающий Но вот иерархия для класса NNumeric у меня вышла такая, какая она есть. И я не нашел пока причин ее переделывать иначе, мне пока этого варианта хватает. Все остальное подчиненно именно постановке задачи и того, что требуется. Т.е., если написаны переопределенные операторы, значит при исходном (без них) варианте, они мне понадобились, чтобы сохранить исходный вариант записи при добавлении операций с "*". Все, как учил дядька Страустрап.  Подмигивающий
Не думаете ли Вы, что задуманная Вами архитектура единствена?
Я хочу сказать, что нужно учится выбирать правильные решения, а не решения, которые направлены на обход граблей.
Я тоже согласен с brankovic, что введение таких сомнительных операторов только запутывают логику и программу - это грабли, на которые кто-нить да наступит..

А можно, если не сложно, описать для чего всё это нужно и как по Вашему это всё работает и почему это должно быть именно так?
Вобщем описание проблемы не могли бы изложить?  
1770  Программирование / С/C++ / Re: Как узнать о типе, до выполнения dynamic_cast? : Март 07, 2011, 15:25
Вот, вот, вместо того, чтобы сесть, тчательно подумать над архитектурой, проникнуться теорией, а уже потом имея фундамент, что то ваять, лучше тратить время на то, чтобы учится создавать костыли и костыли для костылей и т.д.
Герой на героине,
Героине на героине..
 Смеющийся
Улыбающийся Ну я лично использую тот же метод что и Eten (ваять а там разберемся) и не считаю что это хуже. Просто надо более крытычно относиться к написанному и не бояться переделок. А "заложить фундамент" не всегда возможно, никогда не предусмотреть всего заранее.

Не спорю, что всего заранее не предусмотреть. Но, "заложить фундамент" я понимаю как некий основной теор. минимум: как вообще другие с подобными проблемами справлялись, есть ли отточенные решения для этой ситуации, какие инструменты ит.д.
И под архитектурой я вовсе не имею ввиду окончательный вариант, но некий интерплей между объектами, их обязанности,  иерархия, какие то свойства основные..
Короче, хотел выразить мысль, что картина вырисовывается не из-за понятий, а из взаимоотношений между ними.. Как то так))
К тому же, хуже от того, чтобы вначале подумать, взять листочек с ручкой, почеркать, походить, покурить точно не будет) 
(разве что от покурить)))
   
Страниц: 1 ... 116 117 [118] 119 120 ... 140

Страница сгенерирована за 0.251 секунд. Запросов: 24.