Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
al3xeyku
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 5
1

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

21.02.2013, 12:38. Просмотров 522. Ответов 15
Метки нет (Все метки)

Добрый день!
изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело...

Есть структура - 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;
ума не приложу, почему так происходит

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

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

Непонятки с указателями
#include <iostream> using namespace std; int is_order(const int* array) { ...

Указателями массивов
#include <iostream> #include <math.h> #include <stdlib.h> #include <iomanip>...

работа с указателями
Помогите решить задачу в С++ (я в этом начиющий): 1)Из положительных значений...

проблема с указателями
struct magazin { int nomer; char nazvanie; char fio; int kol; double...

ошибка с указателями
надо создать двусвязный список! во второй строке ошибка, как от неё избавиться?...

15
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
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) и наступит счастье
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
21.02.2013, 12:47 3
C++
1
CPointSaver(Point &point)
0
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;
    }
0
Kuzia domovenok
2320 / 2069 / 480
Регистрация: 25.03.2012
Сообщений: 7,372
Записей в блоге: 1
21.02.2013, 12:57 5
Цитата Сообщение от Vourhey Посмотреть сообщение
CPointSaver(Point &point)
это вообще ссылка. Автор про указатели спрашивал. Давайте всё же отделять мух от котлет.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
21.02.2013, 13:03 6
Цитата Сообщение от al3xeyku Посмотреть сообщение
(Point *)&point
Не стоит лишний раз так делать. Да и смысл в данном случае? Стоит либо принимать ссылку не на константу, либо сделать поле класса указателем на константу.
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
21.02.2013, 13:20 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще ссылка.
Да ты что. Опомнись. Какая ссылка. Нет такого в природе.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Автор про указатели спрашивал.
Автор про указатели ничего не спрашивал. Читай внимательно. Открой глаза, если по-другому читать не получается.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Давайте всё же отделять мух от котлет.

Не по теме:

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

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

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

Добавлено через 41 секунду
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Она используется при инициализации:
Цитата Сообщение от al3xeyku Посмотреть сообщение
CPointSaver ps1 = p1; // содержит указатель на p1
Тута )
0
Kuzia domovenok
2320 / 2069 / 480
Регистрация: 25.03.2012
Сообщений: 7,372
Записей в блоге: 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;
    }
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
21.02.2013, 13:27 11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Цитата Сообщение от al3xeyku Посмотреть сообщение
C++
1
CPointSaver ps1 = p1; // содержит указатель на p1
Нет?
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
21.02.2013, 13:31 12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
указатели и конкретный вопрос есть
Это не вопрос, это код. Вопроса про указатели в сообщении нет есть вопрос "почему так?". Но он не про указатели и не налагает ограничения на ответ.

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

Не по теме:

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

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

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

Работа с указателями
1. Написать функцию, принимающую в качестве параметра указатель на первый...

Операции с указателями
Задание.Создать указатель *ptr на целочисленную переменную и присвоить число...

NULL с указателями
С понятием NULL столкнулся только что при изучении указателей. Поэтому еще не...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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