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

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

Войти
Регистрация
Восстановить пароль
 
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Указатели на объекты - C++

21.08.2012, 13:00. Просмотров 914. Ответов 16
Метки нет (Все метки)

В книге Шилдта, есть фрагмент кода:

C++
1
2
3
4
5
6
7
TwoDShape *shapes[5];
    
    shapes[0] = &Triangle("pryamougolni",8.0,12.0);
    shapes[1] = &Rectangle(10);
    shapes[2] = &Rectangle(10,4);
    shapes[3] = &Triangle(7.0);
    shapes[4] = &TwoDShape(10,20,"general");
Вопрос:где хранятся сами объекты на которые, указывают указатели shapes?
Почему выше приведённый код работает, а вот этот нет (как-будто бы почти тоже самое):

C++
1
2
  int *p;
  p = &2;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 13:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на объекты (C++):

Указатели на объекты - C++
имеется класс Users и массив указателей на класс Users* userq у класса Users есть метод charsheet() и свойство Я вызываю...

Указатели на объекты - C++
Здравствуйте! Есть класс, назовем его Some. Он содержит указатель на объект класса Other в качестве одной из переменных (свойств). В...

Указатели на константные объекты - C++
Нельзя создать неконстантный указатель на константный объект по понятным причинам, но имеем такой код: typedef char* pStr; int...

Указатели на объекты класса - C++
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь скомпилировать вот этот пример из книги: ...

Указатели на объекты в массиве - C++
#include <iostream> #include <string> using namespace std; /////////////////////////////////////////////////////////// class person...

Создать указатели и ссылки на объекты в памяти - C++
Помогите, кто может Создайте в свободной памяти три объекта различных типов (Cat, Worker, Pencil…). Замените указатели ссылками и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:09 #2
bgm313, Это не тоже самое. А вы уверены что этот пример вообще работает? Нельзя взять адрес временного объекта.

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
class C
{
};
 
int main()
{
   C* p = &C();
}
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp
new.cpp: В функции «int main()»:
new.cpp:9:14: ошибка: адрес от временной переменной [-fpermissive]
Но даже, если это компилируется - код опасен. Конструируется временный объект, от него берется адрес (?), вызывается деструктор временного объект, указатель указывает на удаленный объект.
0
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.08.2012, 13:10 #3
ну вообще где еще могут хранится обьекты? - в памяти компьютера, в какой либо его ячейке.

ну, а не работает, потому что под 2 еще не резервировалась память, следовательно, указателю не на что ссылаться.
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:21 #4
5.3.1/3 драфт n3337

The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue or a qualified-
id. If the operand is a qualified-id naming a non-static member m of some class C with type T, the result has
type “pointer to member of class C of type T” and is a prvalue designating C::m. Otherwise, if the type of
the expression is T, the result has type “pointer to T” and is a prvalue that is the address of the designated
object (1.7) or a pointer to the designated function. [ Note: In particular, the address of an object of type
“cv T” is “pointer to cv T”, with the same cv-qualification. — end note ] [ Example:
C++
1
2
3
struct A { int i; };
struct B : A { };
... &B::i ...
— end example ] [ Note: a pointer to member formed from a mutable non-static data member (7.1.1) does
not reflect the mutable specifier associated with the non-static data member. — end note ]
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:24  [ТС] #5
[QUOTE=ForEveR;3377397]bgm313, Это не тоже самое. А вы уверены что этот пример вообще работает? Нельзя взять адрес временного объекта.

Да уверен, но неужели Шилдт мог допустить такую оплошность?
Код взят из кнги C++ для начинающих в разделе наследование и виртуальные функции.
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:26 #6
bgm313, Название книги и желательно страницу.
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:39  [ТС] #7
Г. Шилдт. C++. Руководство для начинающих. 2005 год. 669 стр. djvu. 18.1 Мб.
Страницы 509 - 513
0
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.08.2012, 13:39 #8
C++
1
2
3
4
5
6
7
TwoDShape *shapes[5];
    
    shapes[0] = &Triangle("pryamougolni",8.0,12.0);
    shapes[1] = &Rectangle(10);
    shapes[2] = &Rectangle(10,4);
    shapes[3] = &Triangle(7.0);
    shapes[4] = &TwoDShape(10,20,"general");
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:43 #9
Aloir, Тут идет взятие адреса от временной переменной.
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:44  [ТС] #10
Цитата Сообщение от Aloir Посмотреть сообщение
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
Я не спорю, он работает. Но вопрос в том, где хранятся объекты, на которые ссылаются указатели из массива shapes. С моей точки зрения код не совсем корректен: создается временный объект и его адрес присваивается какому-то элементы массива shapes. Но далее это объект уничтожается или нет?
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.08.2012, 13:45 #11
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:46  [ТС] #12
Объект уничтожается, я проверил.
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:46 #13
bgm313, Да, там именно так. Ну что ж. Просто знайте, что этот код некорректный, потому как взятие адреса от временной переменной ни к чему хорошему не приведет.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:48  [ТС] #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
Согласен, но меня больше интересует почему Шилдт так накосячил?
0
ForEveR
В астрале
Эксперт С++
7973 / 4735 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
21.08.2012, 13:49 #15
bgm313, Ну потому что Шилдт все же пишет многое вразрез со стандартом. На уровне начинающих - на это внимание не заостряют.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2012, 13:49
Привет! Вот еще темы с ответами:

Реализуйте алгоритм сортировки для массива, содержащего указатели на объекты-множества целых чисел - C++
Помогите сделать лабу, Я даже не знаю с чего начинать. Пользователь вводит в программу текст произвольной длины, завершая ввод...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? - C++
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции (указатели объектов положены в массив)?

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться - C++
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...


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

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

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