Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Февраль 12, 2011, 11:45



Название: Вопрос про указатели
Отправлено: merke от Февраль 12, 2011, 11:45
Всем привет!
Прошу не пинать!)
Пишу на Qt приличное время. Но всё же остались пробелы.
Объясните во такой момент.

Чем вот это:

Код:
QList<QTcpSocket> lstSoc;
Отличается от:

Код:
QList<QTcpSocket*> lstSoc;


Название: Re: Вопрос про указатели
Отправлено: TheAthlete от Февраль 12, 2011, 12:04
QList<QTcpSocket> lstSoc;
означает, что ты создаешь связанный список элементов типа QTcpSocket

QList<QTcpSocket*> lstSoc;
означает, что ты создаешь связанный список указателей на тип QTcpSocket

т.е. если "развернуть" все это в переменные, то получится примерно следующее
QTcpSocket lstSoc;
QTcpSocket* lstSoc;

естественно, в случае списка их будет n-е количество


Название: Re: Вопрос про указатели
Отправлено: merke от Февраль 12, 2011, 12:12
Наверное вопрос не понятно я задал...

Попробую по другому. В чем преимущество если я буду в списке использовать указатели?


Название: Re: Вопрос про указатели
Отправлено: GreatSnake от Февраль 12, 2011, 12:30
Цитировать
Попробую по другому. В чем преимущество если я буду в списке использовать указатели?
В общем случае не в чём. Всё зависит от задачи.


Название: Re: Вопрос про указатели
Отправлено: Sergey B. от Февраль 12, 2011, 13:02
Цитировать
Попробую по другому. В чем преимущество если я буду в списке использовать указатели?

Будет выше скорость работы, особенно при операциях копирования контейнеров.
Из минусов, если у элементов (на которые ссылается указатель из QList) нет родителя, необходимо будет самому удалять элементы в цикле.

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


Название: Re: Вопрос про указатели
Отправлено: alexman от Февраль 12, 2011, 13:08
Если объект используется в нескольких местах, то удобно использовать указатель на него...отсюда и преимущество QList<QTcpSocket*>.


Название: Re: Вопрос про указатели
Отправлено: merke от Февраль 12, 2011, 13:09
спасибо!


Название: Re: Вопрос про указатели
Отправлено: Igors от Февраль 12, 2011, 13:49
Конкретно для контейнера QList хранение указателей ничего не выигрывает (а только проигрывает), т.к. QList<QTcpSocket> распределяет память для каждого элемента и сам (скрыто) хранит массив указателей на них. Хранить адреса элементов можно - они не изменятся. Ну может использовать указатели из соображений "общности" - все это только для QList, потом нельзя будет заменить его на др. контейнер.


Название: Re: Вопрос про указатели
Отправлено: kirill от Февраль 14, 2011, 16:17
В первом случае ты создаешь n элементов на стеке и помещаешь их в список. В список они копируются, исходные копии по выходу из области видимости разрушаются.

Во втором случае ты создаешь указатели на объекты, которые еще не созданы. Их нужно создать на куче и заполнить список. По окончании работы с объектами их нужно будет удалить. В первом случае они уничтожатся самостоятельно.

Предпочтительнее использовать второй метод, т.к. операции копирования объектов довольно затратные.