LINUX.ORG.RU

С++ Qt4 хочу мигрировать на это добро с Java/swing


0

0

Господа, подкиньте книженцию желательно для чайников (что бы понять в полной мере и без вопросов) вводную в С++ а так же источник, где бы раздобыть документацию к С++ и Qt4 ко второму нашел в QtCreator'е только вот что-то хелпов по самому C++ там не вижу.

★★★★★

Ответ на: комментарий от Siado

>за такие вещи IDE должна глаз в остро держать

ЩИТО?

yoghurt ★★★★★
()
Ответ на: комментарий от SV0L0CH

>Я бы тут порекомендовал обратить внимание на контейнеры и итераторы. QList QMap etc

Спс, вот это штука нужная!

Siado ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Если надо всё-таки указатель - делай auto_ptr<тип>.

В Qt для этих же целей используются QScopedPointer, QSharedPointer, QSharedDataPointer и тд

Gorthauer ★★★★★
()

Господа, разьясните пожалуйста в двух словах описание классов - что должно желать в файле name.h и name.cpp

Я так понял что в name.h - список полей, методов и конструкторов. (публичных приватных и т.п.)
а в name.cpp описание всего этого добра.

Только в синтаксе запутался слегка, что где должно быть.

З.Ы. Есть ли в QtCreator какая-нить няшка что бы *.h(или *.cpp) автогенерить по *.cpp(или *.h) ?

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Ибо у С++ мне льстит скорость + стопицот нужных мне уже готовых и «вылизанных» годами


Разве что если твоя программа жутко вылизанная числодробилка по добыванию очередного знака в числе 3.14 либо поиске выигрышных номеров в лотерее 6 из 49. Иначе не пойму, куда тебе скорость впилась. А стопицот либ для жабы это где-то 7-8% от общего количества

Karapuz ★★★★★
()
Ответ на: комментарий от Siado

Хотел бы пример простого класса

*.h :

class test {
    int x, y;
  public:
    void set_values (int,int);
    int multipl () {return (x*y);} //Реализация добра зазве в заголовочном файле быть должна?
};

*.cpp:

void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}
Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Только в синтаксе запутался слегка, что где должно быть.


Когда надоест разгребать этот синтаксис плюнешь и вернешься в понятное лоно жабы, я гарантирую это

Karapuz ★★★★★
()
Ответ на: комментарий от Karapuz

>Разве что если твоя программа жутко вылизанная числодробилка по добыванию очередного знака в числе 3.14 либо поиске выигрышных номеров в лотерее 6 из 49. Иначе не пойму, куда тебе скорость впилась.

НэйроСэти. Статистика и т.д. В ви, сударь, только число пи считаете?

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Ибо у С++ мне льстит скорость


И, кстати, зачем тебе скорость? Если твоя программа на C++ будет работать на 5% быстрее чем на жабе, тебе на 5% больше за нее заплотют? Если нет, то нет смысла корячиться. Что твоя программа делает, ищет телефон по справочнику? Если она будет находить его не за 0,3 сек, а за 0,285 сек, это ж никто не заметит

Karapuz ★★★★★
()
Ответ на: комментарий от Siado

НэйроСэти. Статистика и т.д.


Вобщем, ясно, поциент клинически не понимает вектора развития программирования http://www.linux.org.ru/view-message.jsp?msgid=4443532 C++ в параллелизации не поможет. Через пару лет срочно начнешь наверстывать упущенное и жалеть, что потратил год на этот нелепый Qt4.

Karapuz ★★★★★
()
Ответ на: комментарий от Siado

О, это я лужу испортил. Дошло как надо:

*.h

#ifndef CUSTOMCLASS_H
#define CUSTOMCLASS_H

class customclass
{
public:
    customclass();
    void setX(int);
    int getX();

private:
   int  x;

};

#endif // CUSTOMCLASS_H

*.cpp

#include "customclass.h"

customclass::x
        
customclass::customclass()
{

}

customclass::setX(int a) 
{
    x = a;

}

customclass::getX(int a) 
{
    x = a;

}

Разве что как-то с полями по тупому написал, разобраться надо )

Siado ★★★★★
() автор топика
Ответ на: комментарий от Karapuz

В *.h файлах находятся прототипы классов и функций, также туда нужно пихать предварительные объявления, чтобы ускорить компиляцию. Предварительное объявление это нечто вроде

bar.h
class foo;
class bar {
  bar();
  ~bar();
private:
  QScopedPointer<foo> m_foo;
}
bar.cpp
include "foo.h"
bar:bar() : m_foo (new foo)
{
}
bar:~bar()
{
}
Обрати внимание на то, как конструктор описан, m_foo(new foo) это инициализация foo. QScopedPointer позвляет руками не следить за указателем и сам его подчистит, а ещё он не даст передать указатель на объек во внешний мир

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

Через пару лет срочно начнешь наверстывать упущенное и жалеть, что потратил год на этот нелепый Qt4.

Там есть для параллелизма средства и достаточно могучие.

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

>Обрати внимание на то, как конструктор описан, m_foo(new foo) это инициализация foo. QScopedPointer позвляет руками не следить за указателем и сам его подчистит, а ещё он не даст передать указатель на объек во внешний мир

Такс, кажись надо начинать с с++ и с Qt4 одновременно =) Я я-то по наивности думал, что Qt4 это просто формочки рисовать. А оно оказывается чего только не делает.

Siado ★★★★★
() автор топика
Ответ на: комментарий от Karapuz

> Если твоя программа на C++ будет работать на 5% быстрее чем на жабе

угу, стоит посмотреть на visual и xcode против eclipse и netbeans, и сразу видно те самые «5%» :)

lester ★★★★
()
Ответ на: комментарий от ratatosk

А оно оказывается чего только не делает.

Формочки это где то пятая часть Qt

Gorthauer ★★★★★
()
Ответ на: комментарий от Siado

>Реализация добра зазве в заголовочном файле быть должна?

Методы с тривиальными операциями принято прямо в .h определять, тогда они автоматически считаются inline. Канонический пример:

size_t size() const {return m_size; }

Кстати, против геттеров я ничего не имею, а вот нахрена нужны сеттеры? Если прям так нужны и геттер и сеттер, то, может, просто сделать поле публичным? Ну и другие вопросы надо себе задать.

Ещё один момент: принято геттерам (и вообще методам, не меняющим объект) константность указывать. Но по началу можешь себя голову не забивать. До тех пор, пока не словишь баг, который бы нашёл компилятор, будь у тебя const'ы расставлены.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Методы с тривиальными операциями принято прямо в .h определять, тогда они автоматически считаются inline. Канонический пример:

От оно шо! спасибо.

Осталось теперь узнать как поля размещать синтаксически. Их то же все равно где ставить - либо в .h либо в .cpp ?


Кстати, против геттеров я ничего не имею, а вот нахрена нужны сеттеры? Если прям так нужны и геттер и сеттер, то, может, просто сделать поле публичным? Ну и другие вопросы надо себе задать.


Ну они то и в правду не нужны вобщем-то. Просто сеттер/геттер это что-то типа Hello world для демонстрации синтаксиса класса =)

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Кстати, против геттеров я ничего не имею, а вот нахрена нужны сеттеры?

void Foo::Foo setBar(const QString bar)
{
    m_bar = bar;
    emit barChanged();
}

Ферштейн?

Gorthauer ★★★★★
()
Ответ на: комментарий от Siado

Кстати, против геттеров я ничего не имею, а вот нахрена нужны сеттеры?

Чтобы не засеттили недопустимое значение какое нибудь.

И, да, в C++ можно шаблонами реализовать семантику «свойств», это когда

obj.proprty = 3;  // тут вызвался сеттер
a = obj.property; // тут - геттер
yoghurt ★★★★★
()
Ответ на: комментарий от lester

стоит посмотреть на visual и xcode против eclipse и netbeans,


Угу, а стоит только посмотреть на какую-нить реальную программу а-ля PL/SQLDev vs JDeveloper как разницы не видно

Karapuz ★★★★★
()
Ответ на: комментарий от Siado

А есть ли в QtCreator'e такая же фигулинка как и в NetBeans'e где можно смотреть классы/методы в удобной иерархичной форме?


Java же на 5% медленнее C++, поэтому QtCreator просто не успевает отобразить классы/методы, как в Netbeans, они появляются и сразу исчезают, ты даже не успеваешь их заметить, настолько быстр C++

Karapuz ★★★★★
()
Ответ на: комментарий от Siado

>Осталось теперь узнать как поля размещать синтаксически

Поля - объявлении класса. Которое в .h. И разрывать на разные файлы его нельзя. Исключение - статические поля, их надо один раз определить в cpp, иначе линковщик не поймёт где их физически разместить.

legolegs ★★★★★
()
Ответ на: комментарий от Gorthauer

>Ферштейн?

Йа-йа, данке шон. Действительно, иногда надо.

legolegs ★★★★★
()
Ответ на: комментарий от Karapuz

> Java же на 5% медленнее C++, поэтому QtCreator просто не успевает отобразить классы/методы, как в Netbeans, они появляются и сразу исчезают, ты даже не успеваешь их заметить, настолько быстр C++

Может у тебя еще и допустимая задержка между щелчками double-click'a в 3 минуты выставлена?

mannaz
()
Ответ на: комментарий от yoghurt

>Чтобы не засеттили недопустимое значение какое нибудь.

ИМХО, более труЪ заиметь тип данных, не допускающий такого значения. Типа NotNullPtr<T>, NotEmptyString и т.п.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Теоретически могут быть и другие ограничения, которые так не задать.

Deleted
()
Ответ на: комментарий от Siado

>Эт точно! Пожалуй погоняю ее с плагином C++ ным. Посмотрю че будет )

ничего хорошего. Парсер все так же тупит, шрифты все так же говно, дебаггер не понимает ничего Qt-шного, и вообще крайне неудобен...

Пока только QtCreator, хоть он тоже топором сделан...

k0l0b0k ★★
()
Ответ на: комментарий от Siado

>З.Ы. Есть ли в QtCreator какая-нить няшка что бы *.h(или *.cpp) автогенерить по *.cpp(или *.h) ?

доктор говорит что эйфория от первого запуска QtCreator проходит где-то через пару дней, на второй сотне строк написанного кода на C++...

k0l0b0k ★★
()

Открыл доки по Qt4. Приятно удивлен. Там этого кутэ как кот наплакал, за день все освоить можно )

Siado ★★★★★
() автор топика
Ответ на: комментарий от Gorthauer

Там даже мышкой можно классы создавать, бугага.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Для временных объектов используй стек (без всяких new). Для членов класса тоже. Для Qt-шных вещей делай как в доке написано. Если надо всё-таки указатель - делай auto_ptr<тип>.

+1

От себя добавлю: старайся вообще не использовать new без необходимости (необходимость — это использование полиморфизма, например), а delete не используй вообще (это не значит, что не нужно удалять объекты — просто сразу приучайся делать так, чтобы они удалялись автоматически, в том числе — при раскрутке стека, вызыванной exception'ом). Если есть возможность использовать boost — используй. Обычно хватает небольшой аккуратности и использования std::auto_ptr/boost::scoped_ptr/boost::scoped_array, причем в большинстве случаев scoped_ptr — самое то. Если нужно хранить массив умных указателей — смотри библиотеку boost.ptr_container. Если нужны умные указатели с подсчетом ссылок — смотри в сторону shared_ptr+weak_ptr. Только необходимо помнить, что их использование точно точно так же вовсе не освобождает от использования головы на плечах.

Ну и сразу: если уж мы избавились от ручной работы с указателями, то старайся вообще их не использовать, а взамен юзать ссылки и boost::optional. Исключение — если что-то нужно передать через границу DLL.

V_L_A_D ★★
()
Ответ на: комментарий от mono

>>Просто и понятно

это точно не про С++

Главное, чтобы не было глобально и надежно, как какой-нибудь быдлошарп

V_L_A_D ★★
()
Ответ на: комментарий от Siado

>Поражает скорость, но все-таки нетбинс его по функциональности облетает ;) Такие вещи как рефакторинг + плагины с UML проверка синтаксиса до компиляции и предложение как лучше исправить и т.д.

Ну бум надеятся дойдет КтКреатор до уровня нетбинса ^_^

К сожалению, не дойдёт — хотя бы потому, что C++ — это не Java. На всяких сложных шаблонах даже серьезные компиляторы могут призадумываться — не говоря уже о парсерах, встроенных в IDE. А все из-за дурацких угловых скобок... В D, кстати, эта проблема решена.

Пока что можно попробовать Eclipse+CDT — там есть рефакторинг, например. Но скорость действительно «поражает», причем наповал:)

V_L_A_D ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.