LINUX.ORG.RU

[qt4]Класс и размещение функций-членов в разных исходных файлах.


0

0

class.h


class QString;
class Foo
{
public:
Foo(){init()};
private:
QString *str;
void init();
void action();
};

class.cpp

#include <QString>
#include "class.h"
void Foo::init()
{
str = new QString;
}

action.cpp

#include "class.h"
void Foo::action()
{
str.size();
}

Вопрос: почему str не видна в функции action?


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

При желании можно и двойной указатель использовать, только в отрыве от контеста задачи это бессмысленно (-:

Задачи, где нужно использовать QString * pointerToStr никак не заменяют задачи, где нужно использовать QString str, как в случае у автора.

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

- Доктор, у меня одно яичко расположено ниже другого.
- Ничего страшного, это норма.
- Да, но как-то неаккуратно получается...

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

Примерно так, да (-: В коде всё должно быть красиво и однозначно. В Qt специально добавили implicitly shared классы, чтобы не выделать их экземпляры в куче и тем самым минимизировать ошибки при работе с памятью. Как, например, у автора - что-то я не вижу в деструкторе delete str.

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

Тут дело не в Qt, а в C++. Но даже в случае с Qt нужно помнить, что классы грубо делятся на с уникальными экземплярами (потомки QObject, запрещён оператор копирования) и разделяемые. Так вот экземпляры QObject могут автоматически удалять только другие дочерние QObject'ы, к которым QString не относится.

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

QObject удаляят детей, которые явно прописаны как дети этого QObject. Указатели без родителей, естественно, он не удаляет.

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

QObject удаляят детей, которые явно прописаны как дети этого QObject. Указатели без родителей, естественно, он не удаляет.

А я думал, что в Qt потомками становится то, что объявлено в классе. Оказывается нужен деструктор.

ShTH
() автор топика

Пардон, что влезаю, но не подскажете хорошую книжку/пособие по Qt4 начального уровня, желательно на русском языке? Спасибо.

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

Я пробовал учить по официальной книге троллей, но решил, что зная плюсы легче учить по документации. Вот вам для начала, думаю найдёте всё необходимое и сможете почувствовать Qt: http://www.doc.crossplatform.ru/qt/4.3.2/how-to-learn-qt.html. Желаю успехов.

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

Идёте по примерам и запускаете всё подряд.

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

А я думал, что в Qt потомками становится то, что объявлено в классе. Оказывается нужен деструктор.

Пример.

Правильно:

class A : public QWidget
{
public:
    A();

private:
    Qlabel *l;
};

A::A() : QWidget()
{
    l = new QLabel(this);
}

Неправильно:

class A : public QWidget
{
public:
    A();

private:
    Qlabel *l;
};

A::A() : QWidget()
{
    l = new QLabel;
}

Костыльно:

class A : public QWidget
{
public:
    A();
    ~A();

private:
    Qlabel *l;
};

A::A() : QWidget()
{
    l = new QLabel;
}

A::~A()
{
    delete l;
}

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

Учитывая, что в реальном коде QLabel скорее всего неявно передаст себя во владение основному QWidget'у через layout'ы, то последний пример также можно занести в категорию «Неправильно».

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

Грубо говоря, конструкций new QString/delete QString не должно быть в коде вообще.

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