Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
#1

Использование указателей при создании обьекта - C++

27.01.2011, 17:13. Просмотров 1262. Ответов 15
Метки нет (Все метки)

Привет!
Собственно вопрос в теме: когда для создания обьекта использовать указатели? Почему в qt и с++ builder используются именно указатели на обьекты, в чем преимущество.
Лично сейчас я не вижу разницы, для меня различие лишь в синтаксисе, писать:
obj.var или obj->var для меня разницы нет.

Видимо я что-то не понимаю???
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 17:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование указателей при создании обьекта (C++):

Ошибка при создании обьекта класса - C++
Объясните пожалуйста почему нельзя создать обьект другого класса в private. В чем ошибка ? Код: class Goods{ public: ...

Использование указателей при обработке матрицы - C++
Ребят,помогите пожалуйста найти в чем ошибка .Задание: В соответствии с вариантом создать функцию, параметром которой является одномерный...

Использование указателей при работе с одномерными массивами - C++
Реализовать на Си. Даны натуральное число n, действительные числа a1,...,an. Если последовательность a1,...,an упорядочена по...

Использование указателей при работе с одномерными и двумерными массивами. - C++
Кто может решить. Даны натуральное число n,действительные числа X1,...,Xn.Вычислить: (X1+X2+2Xn)(X2+X3+2Xn-1)...(Xn-1+Xn+X2) Язык...

Использование указателей при работе с одномерными и двумерными массивами - C++
Даны натуральное число n, действительные числа a1, ..., an. Преобразовать последова-тельность a1, ..., a2n, расположив вначале...

Использование указателей при работе с одномерными и двумерными массивами - C++
Даны натуральное число n, действительные числа A1......An . Если в последовательности A1.....An есть хотя бы один член, меньший, чем -3,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
27.01.2011, 17:35 #2
указатели нужны при создании объекта оператором new
1
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
27.01.2011, 17:54  [ТС] #3
Цитата Сообщение от igorrr37 Посмотреть сообщение
указатели нужны при создании объекта оператором new
Хорошо. смысл создания обьекта оператором new???
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
27.01.2011, 18:25 #4
Цитата Сообщение от @KOT@ Посмотреть сообщение
Хорошо. смысл создания обьекта оператором new???
память выделяется во время работы программы, а не на этапе компиляции
1
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.01.2011, 18:27 #5
В Qt все классы унаследованы от одного базового. Если тебе знакомо понятие виртуальных функций, то тебе должен быть понятен и следующий аспект: если есть некоторый достаточно общий метод, реализованный в базовом классе, то он может быть вызван для любого класса-наследника по указателю на объект базового класса (причем будет вызвана именно реализация этого метода для конкретного класса-наследника). К примеру, метод begin класса QPainter принимает указатель на объект класса QPaintEngine, который содержит все необходимые функции для отображения действий класса QPainter ("The QPaintDevice class is the base class of objects that can be painted"). Именно поэтому мы можем одинаково рисовать на поверхности виджета с помощью класса QPainter, будь тот виджет хоть объектом класса QLabel, хоть QGLWidget, хоть определенным пользователем виджетом (если этот виджет косвенно унаследован от QPaintDevice, конечно). Это было бы невозможно сделать, если бы QDeviceEngine передавался по значению.
В Qt при вызове деструктора виджета автоматически вызывается деструктор для всех его "подчиненных" виджетов (например, класс автоматического размещения QLayout удалит все виджеты, которые он хранит). Это позволяеет разработчику не заморачиваться ручным удалением объектов, для которых динамически выделяется память, что избавляет от класса трудновыявляемых ошибок. Это (хранение в классах-контейнерах объектов разных типов, по указателю на базовый тип) было бы невозможно, если бы мы использовали сами объекты, а не указатели на них.
Ну и при передаче объекта по указателю, а не по значению, не приходится копировать весь объект, что для больших классов было бы слишком накладно.
2
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
27.01.2011, 18:50  [ТС] #6
Цитата Сообщение от panicwassano Посмотреть сообщение
память выделяется во время работы программы, а не на этапе компиляции
Точно, вспомнил - динамическая память!!!

Nameless One, спасибо, так подробно все обьяснил).

А в своих программах имеет смысл использовать указатели в том случае, которые ты описал, либо есть ЕЩЕ СЛУЧАИ, когда будет удобнее и функциональнее использовать указатель?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.01.2011, 19:16 #7
Цитата Сообщение от @KOT@ Посмотреть сообщение
А в своих программах имеет смысл использовать указатели в том случае, которые ты описал, либо есть ЕЩЕ СЛУЧАИ, когда будет удобнее и функциональнее использовать указатель?
Если ты, к примеру, используешь стандартные виджеты в стандартных ситуациях, то лучше хранить указатели на них (учитывая то, что при автоматическом удалении "подчиненных" виджетов используется оператор delete для вызова их деструкторов). Пусть тебе надо сделать свой супер-пупер-мега-виджет, типичная задача при этом - установка (настройка) объекта класса размещения QLayout, для того, чтобы все элементы находились на твоем виджете в строгом порядке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class megaWidget: public QWidget
{
    Q_OBJECT
 
public:
 
    megaWidget(QWidget* parent = 0);
 
protected:
 
    /* Храним именно указатели на виджеты */
    QLabel* plblCaption;
    QPushButton* pcmdDoSomething;
    /* ... */
};
 
megaWidget::megaWidget(QWidget* parent)
    : QWidget(parent)
{
    /* Установка класса размещения */
    QVBoxLayout* pvbl = new QVBoxLayout;
    plblCaption = new QLabel("The Matrix has you");
    pcmdDoSomething = new QPushButton("Follow the White Rabbit");
    pvbl->addWidget(plblCaption);
    pvbl->addWidget(pcmdDoSomething);
    setLayout(pvbl);
    /* ... */
}
Тут используются именно указатели. При уничтожении твоего объекта автоматически вызовется деструктор базового класса, который вызовет деструктор подчиненного объекта QVBoxLayout* pvbl (т.к. он был установлен как главный layout виджета), который, в свою очередь, вызовет деструкторы для метки plblCaption и pcmdDoSomething (т.к. они, в свою очередь, были установлены на этот layout). Таким образом, вся динамически выделенная память будет корректно освобождена автоматически, утечек не будет.
Другие примеры может посмотреть в книжках и примерах/документации Qt. В большинстве случаев, тебе будет достаточно такого признака - если методы работают с указателями на объект, создавай объекты именно как указатели (а не просто используй адрес обычных объектов), и наоборот
2
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
27.01.2011, 19:51  [ТС] #8
Цитата Сообщение от Nameless One Посмотреть сообщение
В большинстве случаев, тебе будет достаточно такого признака - если методы работают с указателями на объект, создавай объекты именно как указатели (а не просто используй адрес обычных объектов), и наоборот
Спасибо, большое, я понял.

И еще вопрос. Ведь Java и c# - как бы более современные языки чем с++, почему там нет указателей? Когда я читал, в книгах говорилось, что указатели небезопасны. Из того, что я понял, они не безопасны потому, что могут ссылаться на другие участки памяти и могут вызвать непредсказуемые последствия.
Действительно ли указатели так опасны, и с ними нужно быть осторожным? ведь наверно незря создатели джава и c# убрали указатели из своих языков?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 20:01 #9
@KOT@, скажем так, плюсы всегда ценили за их одновременную высокоуровневость и низкоуровневость, а так же за мгновенный перескок от высокого уровня к низкому (вот в этой строчке ты вызываешь перегруженный оператор сложения для объекта, а в следующей уже вычисляешь адрес через побитовые операции). Ява вообще выполняется на виртуальной машине, там нет прямого доступа к памяти компьютера. Бритва - тоже штука опасная, так что же теперь, ходить бородатым? Боитесь указателей - не используйте их, правда, потеряете много достоинств. А если будете их использовать и допустите просчёт - не беспокойтесь, процессор не взорвётся, память не расплавится.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.01.2011, 20:01 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Указатели опасны именно потому, что их использование накладывает ответственность на самого программиста. Большинство ошибок, которые возникают благодаря указателем, компилятор просто не заметит. Вместе с тем использование указателей в умелых руках позволяет создавать элегантные решения.
Язык С++, как наследник С, просто вынужден использовать указатели.
Цитата Сообщение от @KOT@ Посмотреть сообщение
ведь наверно незря создатели джава и c# убрали указатели из своих языков?
Не зря. Это называется защитой от дурака. Но, к слову, можно писать и на ассемблере крупные и надежные проекты (взять к примеру ту же KolibriOS), а можно и нагородить глючного быдлокода даже на таких безопасных языках, как java и c#
4
silent_1991
27.01.2011, 20:02
  #11

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
а можно и нагородить глючного быдлокода даже на таких безопасных языках, как java и c#
За это - отдельное спасибо)))

1
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
27.01.2011, 21:16  [ТС] #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
А если будете их использовать и допустите просчёт - не беспокойтесь, процессор не взорвётся, память не расплавится
А что может случиться в самом крайнем случае?

Цитата Сообщение от Nameless One Посмотреть сообщение
Указатели опасны именно потому, что их использование накладывает ответственность на самого программиста
Цитата Сообщение от Nameless One Посмотреть сообщение
Не зря. Это называется защитой от дурака. Но, к слову, можно писать и на ассемблере крупные и надежные проекты (взять к примеру ту же KolibriOS), а можно и нагородить глючного быдлокода даже на таких безопасных языках, как java и c#
Ясно, везде все зависит от умения самого программиста.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 21:18 #13
Цитата Сообщение от @KOT@ Посмотреть сообщение
А что может случиться в самом крайнем случае?
Программа зависнет. На осях до 2000 винды могла повиснуть и система, но сейчас, насколько я знаю, с доступом к "опасным" участкам памяти очень строго и просто так туда не залезть.
1
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
27.01.2011, 21:20  [ТС] #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Программа зависнет. На осях до 2000 винды могла повиснуть и система, но сейчас, насколько я знаю, с доступом к "опасным" участкам памяти очень строго и просто так туда не залезть
Ааа, а я то думал, что может полностью система упасть.

Это вопрос не по теме, но все таки интересно - можно ли написанной программой испортить оборудование? вообще по может как-то навредить оборудованию?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 21:42 #15
@KOT@, подозреваю, что если вы будете писать драйверы, и, например, случайно отключите куллер у видеокарты, то вы её можете спалить (при этом карта должна быть древняя, поскольку у всех более-менее современных карт стоит защита, и если температура поднимается до критической - питание отключается). А так - нет, не получится у вас этого сделать.

Не по теме:

Разве что косвенно, пишите в описании к файлу, что сейчас на экране появится Памелла Андерсон в неглиже, а там на самом деле format c, то особо неуравновешенный юзверь может ненароком расколотить системник к едрени-фене)))

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 21:42
Привет! Вот еще темы с ответами:

Использование переменной в качестве аргумента при создании файла через ofstream - C++
Рассмотрите пожалуйста следующий код, он работает: /*! Тут насколько я понимаю, мы разбираемся с именем создаваемого\открываемого файла ...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя. - C++
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между функциями с помощью глобального...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

использование указателей - C++
Подскажите, пожалуйста, в чем здесь ошибка? #include <iostream> using namespace std; int x = 20; int *x; int main() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.01.2011, 21:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru