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

непонятки с указателями - C++

Восстановить пароль Регистрация
 
al3xeyku
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 5
21.02.2013, 12:38     непонятки с указателями #1
Добрый день!
изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело...

Есть структура - Point (точка). Есть класс, содержащий указатель на эту структуру...
Оператор Point() - для неявного преобразования.

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
29
30
31
struct Point{
    float               x;
    float               y;
};
 
class CPointSaver
{
public:
    CPointSaver(void);
    ~CPointSaver(void);
    CPointSaver(Point point)
    {
        p = &point;
    }
    CPointSaver(Point *point)
    {
        p = point;
    }
    // неявно возвращает указатель на Point
    operator Point*() const
    {
        return p;
    }
 
    Point* GetPointPtr() const // тоже самое, что и оператор выше
    {
        return p;
    }
private:
    Point *             p; // указатель на Point
};
код программы:
C++
1
2
3
4
5
6
7
8
9
    Point p1 = {1, 2};
    Point p2 = {5, 6};
    Point p3 = {7, 9};
 
    CPointSaver ps1 = p1; // содержит указатель на p1
 
    Point* pp1 = ps1.GetPointPtr();
    Point* pp2 = ps1.GetPointPtr();
    Point* pp3 = ps1.GetPointPtr();
сначала я создаю Point'ы. Затем создаю экземпляр CPointSaver, срабатывает конструктор и ps1 хранит указатель на p1. Всё норм.
Но, как только выполняется
C++
1
Point* pp1 = ps1.GetPointPtr();
, значение указателя в ps1 почему-то меняется и он начинает указывать на мусор
причём ничего не изменится, если мы напишем:
C++
1
Point* pp1 = ps1;
ума не приложу, почему так происходит

подскажите, пожалуйста.

с уважением.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 12:38     непонятки с указателями
Посмотрите здесь:

задача с Указателями C++
C++ Проблема с указателями
C++ Непонятка с указателями
Операция с указателями C++
Массив. с указателями с++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maxim Prishchepa
Эксперт С++
 Аватар для Maxim Prishchepa
1761 / 984 / 60
Регистрация: 29.03.2010
Сообщений: 2,975
21.02.2013, 12:45     непонятки с указателями #2
C++ (Qt)
1
2
3
4
CPointSaver(Point point)
    {
        p = &point;
    }
здесь создается локальная переменная, и дальше присваиваете внутреннему указателю p адрес переменной, которая уничтожится после выполнения конструктора. напишите CPointSaver(const Point & point) вместо CPointSaver(Point point) и наступит счастье
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 12:47     непонятки с указателями #3
C++
1
CPointSaver(Point &point)
al3xeyku
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 5
21.02.2013, 12:55  [ТС]     непонятки с указателями #4
Спасибо!
C++
1
2
3
4
    CPointSaver(Point &point)
    {
        p = &point;
    }
работает, но на
C++
1
CPointSaver(const Point &point)
компилятор ругается, т.к. не может преобразовать const Point * в Point *.

ps
хотя если приведение сделать, то компилирует:
C++
1
2
3
4
    CPointSaver(const Point &point)
    {
        p = (Point *)&point;
    }
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.02.2013, 12:57     непонятки с указателями #5
Цитата Сообщение от Vourhey Посмотреть сообщение
CPointSaver(Point &point)
это вообще ссылка. Автор про указатели спрашивал. Давайте всё же отделять мух от котлет.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.02.2013, 13:03     непонятки с указателями #6
Цитата Сообщение от al3xeyku Посмотреть сообщение
(Point *)&point
Не стоит лишний раз так делать. Да и смысл в данном случае? Стоит либо принимать ссылку не на константу, либо сделать поле класса указателем на константу.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:20     непонятки с указателями #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще ссылка.
Да ты что. Опомнись. Какая ссылка. Нет такого в природе.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Автор про указатели спрашивал.
Автор про указатели ничего не спрашивал. Читай внимательно. Открой глаза, если по-другому читать не получается.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Давайте всё же отделять мух от котлет.

Не по теме:

Тебе мухи, мне котлеты.

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.02.2013, 13:24     непонятки с указателями #8
Цитата Сообщение от Vourhey Посмотреть сообщение
Автор про указатели ничего не спрашивал. Читай внимательно. Открой глаза,
читаю первое сообщение, гляжу код, ни одной ссылки не вижу. Ссылок в этой теме нет.

разве что вот так делать нельзя.
C++
1
2
3
4
 CPointSaver(Point point)
    {
        p = &point;
    }
Но эта функция вроде не используется.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:26     непонятки с указателями #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читаю первое сообщение, гляжу код, ни одной ссылки не вижу.
Так же, как и указателей.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ссылок в этой теме нет.
Указателей и вопроса про них тоже нет.

Добавлено через 41 секунду
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Она используется при инициализации:
Цитата Сообщение от al3xeyku Посмотреть сообщение
CPointSaver ps1 = p1; // содержит указатель на p1
Тута )
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.02.2013, 13:27     непонятки с указателями #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Указателей и вопроса про них тоже нет.
указатели и конкретный вопрос есть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//тут есть ссылки?
CPointSaver(Point point){
        p = &point;
    }
//или тут?
    CPointSaver(Point *point){
        p = point;
    }
//или тут?
    operator Point*() const  {
        return p;
    }
//или тут???
   Point* GetPointPtr() const  {
        return p;
    }
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.02.2013, 13:27     непонятки с указателями #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Цитата Сообщение от al3xeyku Посмотреть сообщение
C++
1
CPointSaver ps1 = p1; // содержит указатель на p1
Нет?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:31     непонятки с указателями #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
указатели и конкретный вопрос есть
Это не вопрос, это код. Вопроса про указатели в сообщении нет есть вопрос "почему так?". Но он не про указатели и не налагает ограничения на ответ.

Добавлено через 1 минуту
Цитата Сообщение от al3xeyku Посмотреть сообщение
~CPointSaver(void);
А вот неопределнный конструктор меня смущает, это да. Не уверен, что этот код будет компилиться везде. Unresolved link бы...
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
21.02.2013, 13:36     непонятки с указателями #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще ссылка. Автор про указатели спрашивал. Давайте всё же отделять мух от котлет.
Еще как спрашивал: почему его указатели работают не так, как он ожидает.
Ответ - в неиспользовании в данном случае ссылки при передаче аргумента. Потому о них-то и речь.
Maxim Prishchepa
21.02.2013, 14:34
  #14

Не по теме:

блин... развели срачь, чес слово))
Крылья, ноги.... главное - ХВОСТ!!! (с)

al3xeyku
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 5
21.02.2013, 14:49  [ТС]     непонятки с указателями #15
ой ой, ребята, чтож вы тут развели?))
вопрос был почему указатель внутри класса начинает указывать на мусор. ответ - потому что его значение бралось из локальной переменной конструктора, которая убивалась, после отработки последнего. Отсюда и мусор))
Ссылки, ссылки.. при передаче параметра через & мы имеем доступ к переменной, а брать у неё адрес (опять же используя & или что-то другое с ней делать - эт уже как захочется))

по поводу деструктора, да, можно и его реализовать как:
C++
1
p = NULL
но больше - ничего, т.к. класс - просто хранит указатель на некий объект и нам не нужно удалять объект при удалении класса, это в перспективе можно реализовать)))
зы
Насчёт того, что деструктор не определён был - извините . Вижуал студия создала файл .cpp, где он пустой - но всё же определен. Я код писал в .h-файле, т.к. кода не много))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 15:02     непонятки с указателями
Еще ссылки по теме:

Проблемка с указателями C++
ошибка с указателями C++
C++ Указателями массивов

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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 15:02     непонятки с указателями #16
Цитата Сообщение от al3xeyku Посмотреть сообщение
по поводу деструктора, да, можно и его реализовать как:
Суть не в том, как его реализовывать, а главное, чтобы он вообще был.
Yandex
Объявления
21.02.2013, 15:02     непонятки с указателями
Ответ Создать тему
Опции темы

Текущее время: 09:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru