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

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

Войти
Регистрация
Восстановить пароль
 
 
al3xeyku
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 5
#1

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

21.02.2013, 12:38. Просмотров 468. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос непонятки с указателями (C++):

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

Проблемка с указателями - C++
Нужно перегрузить "+" чтобы он делал слияние 2ух массивов(элементы не повторялись) вот код: #include <iostream.h> #include...

Массив. с указателями с++ - C++
1. Задан массив из 10 целых чисел. Посчитать количество смен знаков заданных чисел. Перебор элементов массива должен осуществляться...

Операция с указателями - C++
SomeClass* ptr = sc1; SomeClass* ptr2 = ptr1; как имея только ptr2 изменить указатель ptr (изменить переменную, на которую ссылается ptr)...

Работа с указателями - C++
#include <iostream> #include <conio.h> using namespace std; void fun(int *p) { int *temp=new int; *temp=15; delete p; ...

Непонятка с указателями - C++
Как так что если указатель на int он покажет свой адрес а на char покажет символ свой. int * pointerInt = new int; char *...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Maxim Prishchepa
Эксперт С++
1922 / 1034 / 74
Регистрация: 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
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.02.2013, 12:57 #5
Цитата Сообщение от Vourhey Посмотреть сообщение
CPointSaver(Point &point)
это вообще ссылка. Автор про указатели спрашивал. Давайте всё же отделять мух от котлет.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
21.02.2013, 13:03 #6
Цитата Сообщение от al3xeyku Посмотреть сообщение
(Point *)&point
Не стоит лишний раз так делать. Да и смысл в данном случае? Стоит либо принимать ссылку не на константу, либо сделать поле класса указателем на константу.
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:20 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще ссылка.
Да ты что. Опомнись. Какая ссылка. Нет такого в природе.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Автор про указатели спрашивал.
Автор про указатели ничего не спрашивал. Читай внимательно. Открой глаза, если по-другому читать не получается.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Давайте всё же отделять мух от котлет.

Не по теме:

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

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

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

Добавлено через 41 секунду
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Она используется при инициализации:
Цитата Сообщение от al3xeyku Посмотреть сообщение
CPointSaver ps1 = p1; // содержит указатель на p1
Тута )
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
21.02.2013, 13:27 #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Цитата Сообщение от al3xeyku Посмотреть сообщение
C++
1
CPointSaver ps1 = p1; // содержит указатель на p1
Нет?
0
Vourhey
Почетный модератор
6482 / 2257 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:31 #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
указатели и конкретный вопрос есть
Это не вопрос, это код. Вопроса про указатели в сообщении нет есть вопрос "почему так?". Но он не про указатели и не налагает ограничения на ответ.

Добавлено через 1 минуту
Цитата Сообщение от al3xeyku Посмотреть сообщение
~CPointSaver(void);
А вот неопределнный конструктор меня смущает, это да. Не уверен, что этот код будет компилиться везде. Unresolved link бы...
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 14:49
Привет! Вот еще темы с ответами:

Ошибка с указателями - C++
Похоже у меня проблема с указателями, но что то я жутко торможу и не соображу как правильно сделать. Как минимум в 44 строке ошибка. ...

помогите с указателями - C++
Помогите переделать через указатель int *x. #include<iostream.h> #include<string.h> #include<conio.h> main() { clrscr();...

Операции с указателями - C++
Собственно вопрос : есть функция void vyvod(char* prov) { printf("%s", prov); } и есть функция void...

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


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

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

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