crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> MFC vs Qt
DEADHUNT
  опции профиля:
сообщение 31.1.2011, 16:22
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(Rocky @ 31.1.2011, 12:48) *
Ну, мне например хватило следующего:
std::map<int, double> test_map;
test_map[0] = 1.0;
test_map[1] = 1.1;
test_map[2] = 1.2;
test_map[3] = 1.3;
test_map[4] = 1.4;

std::map<int, double>::iterator itTest = test_map.find(2);
if (itTest != test_map.end()) itTest->first = 10;

Вот такой код приводит к очень большим проблемам. То же касается std::set например.

нельзя изменять ключ у существующего элемента(тем более у типа first есть модификатор const, поэтому без явного приведения типов твой код не скомпилируется), у тебя код не правильный с точки зрения логики и стандарта, VC++ тут не причём.

Сообщение отредактировал DEADHUNT - 31.1.2011, 16:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 31.1.2011, 16:35
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(DEADHUNT @ 31.1.2011, 16:22) *
нельзя изменять ключ у существующего элемента(тем более у типа first есть модификатор const, поэтому без явного приведения типов твой код не скомпилируется), у тебя код не правильный с точки зрения логики и стандарта, VC++ тут не причём.

Ну я ж не из головы его выдумал. Естественно неправильный. Попробую найти в исходниках где так делал (если найду - на тот момент я не использовал системы контроля версий)...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2011, 18:07
Сообщение #13


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Rocky @ 31.1.2011, 18:35) *
Ну я ж не из головы его выдумал. Естественно неправильный. Попробую найти в исходниках где так делал (если найду - на тот момент я не использовал системы контроля версий)...

не нужно искать. Вполне возможно, что тебе просто запомнилось что-то не так (наверняка эмоции били через край :) ). Я же попробовал - компилятор не пропускает. Вряд ли у тебя была другая версия студии

Сообщение отредактировал Алексей1153 - 31.1.2011, 18:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.1.2011, 18:31
Сообщение #14


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


ничо вы тут холивары развели :)
а я поддержу мнение Rocky, не в смысле, что я за Qt (я просто с ним не работаю), а против MFC. из моего многолетнего опыта программирования (профессионально и для себя) я поняла, что те, кто писал MFC, видимо, никогда ею не пользовались сами. иначе они бы давно поправили то море багов и недочётов (да даже просто банальных глупостей!), которое там имелось, имеется и, видимо, так и будет существовать до конца мелкософта.
ну и как системный программист, конечно же, я предпочитаю линюкс. и я ещё раз в этом убедилась, написав тут недавно по работе драйвер под семёрку: мелкософт зарывается в индусский говнокод. и он повсюду. он не только в MFC, он даже в самих основах системы. там полно багов, нестыковок и нелогичных ни с какой точки зрения решений. в общем, удовольствия для программиста мало, а для юзера - нестабильность, лишние деньги и необходимость приобретать неоправданно мощное железо. единственное, за счёт чего держится мелкософт - за счёт распространённости и того, что под них написано много прикладного ПО, чисто исторически. но уже идёт процесс: сторонние фирмы начали присматриваться к линюксу и писать свои софтины под него. если мелкософт не перестанет писать говнокод - они окончательно забредут в тупик и лопнут. видимо, поэтому Гейтс отошёл от дел и перевёл свои сбережения в туристический бизнес.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2011, 18:36
Сообщение #15


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Iron Bug,
Цитата(Iron Bug @ 31.1.2011, 20:31) *
а против MFC.

ну это твоё личное право. Но вот любопытно, как связано написание драйверов и глюки MFC ?:)

Про производительность - это опять загибон. Как напишешь - так и будет тормозить. У меня не тормозит :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 31.1.2011, 19:37
Сообщение #16


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Iron Bug, спасибо =)

Да, насчет std::map я погорячился... Ну а вот это как?
std::set<int> test_set;
test_set.insert(0);
test_set.insert(1);
test_set.insert(2);
test_set.insert(3);
test_set.insert(4);

std::set<int>::iterator itTest1 = test_set.find(2);
if (itTest1 != test_set.end()) *itTest1 = 7;

std::set<int>::iterator itTest2 = test_set.find(7);
if (itTest2 != test_set.end())
{
    //вот сюда мы не попадем
    qDebug() << *itTest2;
}


Сообщение отредактировал Rocky - 31.1.2011, 19:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2011, 19:43
Сообщение #17


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


напиши комментарии - я не знаю, что должно произойти (этим классом не доводилось пользоваться)

Сообщение отредактировал Алексей1153 - 31.1.2011, 19:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 31.1.2011, 19:48
Сообщение #18


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата
напиши комментарии - я не знаю, что должно произойти

В смысле? К чему писать? Там же итак коммент есть.... :o:

std::set - ассоциативный массив (коллекция). В нем ни в коем случае нельзя изменять данные напрямую. К чему это приводит я там коммент оставил... По названиям ф-й думаю если работаешь с std::map должно быть понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2011, 19:57
Сообщение #19


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


std::map я понимаю, что такое ключ - тоже.


почитал МСДН, вижу, что ты неправильно работаешь с классом:
Цитата
The STL container class set is used for the storage and retrieval of data from a collection in which the values of the elements contained are unique and serve as the key values according to which the data is automatically ordered. The value of an element in a set may not be changed directly. Instead, you must delete old values and insert elements with new values
.



may not - значит не нужно, но не запрещено.
must delete old values - обязательно должен удалить старое значение, а потом только insert elements with new values

И это, кстати, не ассоциативный массив, а просто набор уникальных элементов, отсортированных по предикату

Сообщение отредактировал Алексей1153 - 31.1.2011, 20:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 31.1.2011, 21:00
Сообщение #20


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Так блин... Я знаю что это неправильно. Но почему nmake такое пропускает даже ворнинга не выдает???? Я знаю это сейчас, а по началу были очень большие грабли.

Цитата
почитал МСДН, вижу, что ты неправильно работаешь с классом:

Извини не удержусь.... капитан очевидность )))))))))))))))))))))))))))))))) Я ж специально привел неправильный пример чтобы показать, что компилятор мелкомягких допускает такие вещи....
Это должно быть forbidden. gcc ведь ругается на такие конструкции.
И более того, чтобы понимать почему это должно быть forbidden нужно понимать как вообще устроен std::set


-----
UPD
Цитата(Rocky)
4. Почему нельзя получать доступ к элементам управления окна не из экзэемпляра самого окна?

Цитата(Алексей1153)
4 - как это нельзя ? GetDlgItem(ID).

Создал тестовый MFC/SDI проект. VS 2008. Открыл в ресурсах диалоговое окно "About - IDD_ABOUTBOX". Перетащил мышью на форму кнопку. У нее идентификатор IDC_BUTTON1. Файл test2.cpp:
void Ctest2App::OnAppAbout()
{
    CAboutDlg aboutDlg;
    CWnd *pWnd = aboutDlg.GetDlgItem(IDC_BUTTON1); //вот тут ошибка (пока не понятно почему)
    pWnd->SetWindowTextW(_T("bla-bla-bla"));          //и вот тут ошибка (потому что pWnd  == NULL)
    aboutDlg.DoModal();
}

Почему так??? Я ведь создал экземпляр класса. Я ожидаю, что получу доступ ко всем его открытым методам/членам. Так почему же ошибка???? Ах, вспомнил. Дело в том, что нужно помнить, что вызов CDialog::DoModal() инициирует вызов функции CDialog::OnInitDialog(), в котором и создаются элементы управления этого диалогового окна. Таким образом, чтобы инициализировать элементы управления диалогового окна, единственное где я могу это сделать - только из самого окна. Нужно писать функцию Init(), которую вызывать сразу после создания экземпляра класса, в нее передавать нужные параметры классу. Но в самой Init() еще нельзя выводить эти данные в элементы управления, потому что CDialog::OnInitDialog() еще не был вызван. Таким образом, даже если мне эти данные и нафиг не нужны потом, я должен их сохранять в мемберах. Вот одно это уже убивает. Если здесь есть обходной путь, расскажи пожалуйста... Я честно не знаю. =)

Сообщение отредактировал Rocky - 31.1.2011, 21:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 11:48