crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Время жизни объекта
xbarmaglot
  опции профиля:
сообщение 11.9.2012, 19:40
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

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




Репутация:   0  


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

class Parent : public QObject {
private:
    void func1();
    void func2();
    void func3();
    ...
    void funcN();
public :
    class Some : public QObject {
    private:
        Some(Parent* parent) : QObject(parent) {}

    public :
        void func1() { parent()->func1(); }
        void func2() { parent()->func2(); }
    }

    Some* get_some() { return new Some(this); }
}


Ну или объект Some имеет открытый конструктор и используется так.
Parent parent;
Some some(&parent);


Если бы Some не использовался снаружи, то имел бы время жизни не более чем время жизни Parent.
Тогда при удалении Parent разрушен был бы и Some.

Но что будет если
Parent* parent = new Parent();
Some* some = parent->get_some();
delete parent;
some->func1();


Будет ли хотябы отладочное разумное сообщение или просто вылет приложения?
Не отдавать же классу Some в конструкторе QSharedPointer на Parent. Ведь в документации обычно не пишут про время
жизни вспомогательных объектов. По крайнем мере я в документации QT это не встречал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.9.2012, 20:55
Сообщение #2


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

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

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




Репутация:   34  


зачем так усложнять себе жизнь всё запутывать ?

Предлагаю начать с постановки задачи :)

для разбиения задачи на функции, к примеру, с промежуточными объектами достаточно сделать эти функции статическими , а объекты передавать в них по ссылке или указателю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 12.9.2012, 6:45
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

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




Репутация:   0  


Цитата(Алексей1153 @ 11.9.2012, 21:55) *
для разбиения задачи на функции, к примеру, с промежуточными объектами достаточно сделать эти функции статическими , а объекты передавать в них по ссылке или указателю.

ничего не понял

З.Ы. Да и вопрос собственно не в этом. Может просто пример не совсем удачен
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.9.2012, 11:01
Сообщение #4


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

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

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




Репутация:   34  


Цитата(Алексей1153 @ 11.9.2012, 23:55) *
Предлагаю начать с постановки задачи

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 13.9.2012, 11:11
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

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




Репутация:   0  


Цитата(Алексей1153 @ 13.9.2012, 11:01) *
Предлагаю начать с постановки задачи

У меня объект имеет доступ с несколький десяткам интерфейсов (нак исторически сложилось :))
class Owner 
{
    bool Interface1_Method1();
    bool Interface1_Method2();
    ...
    bool InterfaceN_MethodN();
}


Задача поделить их и раздавать пользователю только те, которые ему необходимы.
Если реализовывать классы-обертки, то нужен контроль времени жизни объекта обертки.
То есть если есть
class Wrapper wrapper(Parent* parent);

и parent грохнуть, то wrapper должен при использовании закричать, что нет parent.

З.Ы. Можно конечно сделать так
ckass Wrapper wrapper(QSharedPointer<Parent> parent);

Но я думал, что в QObject это уже реализовано
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 13.9.2012, 11:25
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

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




Репутация:   3  


Цитата(xbarmaglot @ 13.9.2012, 12:11) *
З.Ы. Можно конечно сделать так
ckass Wrapper wrapper(QSharedPointer<Parent> parent);

Но я думал, что в QObject это уже реализовано


Есть QPointer.

Если parent и wrapper являются QObject, то можно использовать для оповещения сигнал destroyed().

Сообщение отредактировал ssoft - 13.9.2012, 11:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.9.2012, 6:16
Сообщение #7


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

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

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




Репутация:   34  


Цитата(xbarmaglot @ 13.9.2012, 14:11) *
class Owner
{
    bool Interface1_Method1();
    bool Interface1_Method2();
    ...
    bool InterfaceN_MethodN();
}


методами этого класса пользователь не сумеет воспользоваться - они все private :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 14.9.2012, 6:53
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

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




Репутация:   0  


Цитата(ssoft @ 13.9.2012, 11:25) *
Если parent и wrapper являются QObject, то можно использовать для оповещения сигнал destroyed().

сигнал parent?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 28.11.2024, 22:49