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

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

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

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

21.02.2013, 12:38. Просмотров 459. Ответов 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;
ума не приложу, почему так происходит

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

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

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

Работа с указателями - C++
Помогите пожалуйста объяснить, не понимаю почему число присваемое через указатель *А в кавычках, и равны ли *А и просто А??? char *A =...

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

Работа с указателями - C++
Расскажите как работает каждая строка в коде char *A = "123456789"; unsigned B = 1; char *X = A + B; char *Y = A - (-...

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

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

ошибка с указателями - C++
программа должна менять буквы местами в каждом слове введенной строки через указатели я все написал все работает, но есть большое НО,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 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) и наступит счастье
Vourhey
Почетный модератор
6474 / 2249 / 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
21.02.2013, 12:57     непонятки с указателями #5
Цитата Сообщение от Vourhey Посмотреть сообщение
CPointSaver(Point &point)
это вообще ссылка. Автор про указатели спрашивал. Давайте всё же отделять мух от котлет.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
21.02.2013, 13:03     непонятки с указателями #6
Цитата Сообщение от al3xeyku Посмотреть сообщение
(Point *)&point
Не стоит лишний раз так делать. Да и смысл в данном случае? Стоит либо принимать ссылку не на константу, либо сделать поле класса указателем на константу.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:20     непонятки с указателями #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще ссылка.
Да ты что. Опомнись. Какая ссылка. Нет такого в природе.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Автор про указатели спрашивал.
Автор про указатели ничего не спрашивал. Читай внимательно. Открой глаза, если по-другому читать не получается.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Давайте всё же отделять мух от котлет.

Не по теме:

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

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

разве что вот так делать нельзя.
C++
1
2
3
4
 CPointSaver(Point point)
    {
        p = &point;
    }
Но эта функция вроде не используется.
Vourhey
Почетный модератор
6474 / 2249 / 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
21.02.2013, 13:27     непонятки с указателями #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но эта функция вроде не используется.
Цитата Сообщение от al3xeyku Посмотреть сообщение
C++
1
CPointSaver ps1 = p1; // содержит указатель на p1
Нет?
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2013, 13:31     непонятки с указателями #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
указатели и конкретный вопрос есть
Это не вопрос, это код. Вопроса про указатели в сообщении нет есть вопрос "почему так?". Но он не про указатели и не налагает ограничения на ответ.

Добавлено через 1 минуту
Цитата Сообщение от al3xeyku Посмотреть сообщение
~CPointSaver(void);
А вот неопределнный конструктор меня смущает, это да. Не уверен, что этот код будет компилиться везде. Unresolved link бы...
ITcrusader
Эксперт C++
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++
Написать программу, в которой выполнить следующие действия: 1) Описать указатели на все известные типы данных; 2. Выполнить для каждого...

Указателями массивов - C++
#include <iostream> #include <math.h> #include <stdlib.h> #include <iomanip> using namespace std; int main() ...

проблема с указателями - C++
struct magazin { int nomer; char nazvanie; char fio; int kol; double dohod; magazin *prev,*next; magazin *pt,*pg; } ...

ошибка с указателями - C++
надо создать двусвязный список! во второй строке ошибка, как от неё избавиться? pt->prev=pg; pg->next=pt; pg=pt;

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


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

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

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