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

Почему не возвращается значение через указатель из метода класса? - C++

Восстановить пароль Регистрация
 
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:16     Почему не возвращается значение через указатель из метода класса? #1
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода из метода, указатель не указывает на присвоеное ему значение внутри тела метода. Почему так происходит?
TestingCPPSyntax.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
namespace Casper
{
    class TestingCPPSyntax
    {
    public:
        TestingCPPSyntax(void);
        ~TestingCPPSyntax(void);
        void TestPointerBehavior(int * pValue);
 
    private:
        void CreateValue(int * pValue);
    };
}
TestingCPPSyntax.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "TestingCPPSyntax.h"
namespace Casper
{
    TestingCPPSyntax::TestingCPPSyntax(void)
    {
    }
 
    TestingCPPSyntax::~TestingCPPSyntax(void)
    {
    }
 
    void TestingCPPSyntax::TestPointerBehavior(int * pValue)
    {
        CreateValue(pValue);
    }
 
    void TestingCPPSyntax::CreateValue(int * pValue)
    {
        pValue = new int(1000);
    }
}
Program.cpp
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
#include <iostream>
#include "Person.h"
//#include <windows.h>
#include "Rect.h"
#include "TestingCPPSyntax.h"
#include <vector>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int * pTest = __nullptr;
    Casper::TestingCPPSyntax * pTester = new Casper::TestingCPPSyntax();
    pTester->TestPointerBehavior(pTest);
    //cout << "tester.TestPointerBehavior(pTest);  pTest = " << *pTest << endl;
    delete pTester;
    pTester = __nullptr;
 
    system("pause");
    return EXIT_SUCCESS;
}
В коде есть закоментированная строка, она закоментирована, потому-что вылетает программа с ошибкой, так как pTest судя по всему ни на что не указывает, ну или попросту null.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2012, 18:16     Почему не возвращается значение через указатель из метода класса?
Посмотрите здесь:

C++ Вызов метода производного класса через обращение к методу базового класса
C++ Почему не обнуляется указатель через функцию?
Обращение к методам класса через указатель на экземпляр класса C++
C++ Возврат значения метода через указатель
C++ Как получить значение из метода класса, если метод возвращает указатель?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:37     Почему не возвращается значение через указатель из метода класса? #2
C++
1
2
3
4
void TestingCPPSyntax::CreateValue(int * pValue)
{
        pValue = new int(1000);
}
Что это собственно значит? ну или какой смысл вы вложили в этот метод?
Если вы хотите по указателю записать число 1000, то попробуйте просто записать так
C++
1
*pValue = 1000;
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:42  [ТС]     Почему не возвращается значение через указатель из метода класса? #3
Я хотел, чтобы после выхода из метода TestPointerBehavior, указатель pTest содержал значение, которое было ему присвоено внутри TestingCPPSyntax::CreateValue.

Добавлено через 37 секунд
Чтобы далее код вывел значение 1000:
C++
1
cout << "tester.TestPointerBehavior(pTest);  pTest = " << *pTest << endl;
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:44     Почему не возвращается значение через указатель из метода класса? #4
Смотрите мой пост выше
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:44  [ТС]     Почему не возвращается значение через указатель из метода класса? #5
Цитата Сообщение от Mustik Посмотреть сообщение
Если вы хотите по указателю записать число 1000, то попробуйте просто записать так
Так не получится, так как изначально указатель null. Вылетает исключение:
Необработанное исключение в "0x778b15de" в "Test.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000".
Добавлено через 23 секунды
Цитата Сообщение от Mustik Посмотреть сообщение
Смотрите мой пост выше
Да я просто не успел ответить, так-то всё видел сразу же.
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:45  [ТС]     Почему не возвращается значение через указатель из метода класса? #6
Походу я чего-то не понимаю или понимаю не так. Видимо передавать в метод указатель указывающий на null нету смысла?
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:53     Почему не возвращается значение через указатель из метода класса? #7
Удалено. Бред написал.

Добавлено через 1 минуту
Цитата Сообщение от Casper-SC Посмотреть сообщение
Видимо передавать в метод указатель указывающий на null нету смысла?
Так и есть.

Добавлено через 3 минуты
Короче, вам нужно исправить метод CreateValue на
C++
1
2
3
4
void TestingCPPSyntax::CreateValue(int * pValue)
{
        *pValue = 1000;
}
и исправить в main'е
C++
1
2
3
int pTest;
...
pTester->TestPointerBehavior( &pTest );
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
10.03.2012, 18:55     Почему не возвращается значение через указатель из метода класса? #8
int * pTest = __nullptr;
cout << "tester.TestPointerBehavior(pTest); pTest = " << *pTest << endl;

указатель равен 0;

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

если уж ставишь такие замысловатые эксперименты то передавай укзатель по ССЫЛКЕ в свои методы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void ptrtest (int*& ptr) //обрати внимание - по ССЫЛКЕ
{
 
    ptr = new int (1000);
};
 
int main()
{
 
int *ptr =0;//тут ноль
 
ptrtest(ptr);
 
printf("%d",*ptr);//тыща выйдет
 
delete ptr;//не забываем удалять
}
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:56  [ТС]     Почему не возвращается значение через указатель из метода класса? #9
Цитата Сообщение от Mustik Посмотреть сообщение
*pValue = new int(1000);
Это вообще не компилируется.

IntelliSense: значение типа "int *" нельзя присвоить сущности типа "int"
error C2440: =: невозможно преобразовать "int *" в "int"
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:57     Почему не возвращается значение через указатель из метода класса? #10
Исправился
*pValue = 1000;
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
10.03.2012, 18:59  [ТС]     Почему не возвращается значение через указатель из метода класса? #11
Цитата Сообщение от Luke Посмотреть сообщение
если уж ставишь такие замысловатые эксперименты то передавай укзатель по ССЫЛКЕ в скои методы
А вот оно что. Я думал, если передаёшь скажем просто int, то передаётся копия, если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2012, 19:04     Почему не возвращается значение через указатель из метода класса?
Еще ссылки по теме:

C++ Почему у дружественной функции два аргумента, а у метода класса один?
C++ Вызов метода класса через указатель на ноль
Вызов метода производного класса через указатель на базовый класс C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.03.2012, 19:04     Почему не возвращается значение через указатель из метода класса? #12
Цитата Сообщение от Casper-SC Посмотреть сообщение
если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
указатель это всего лишь адрес + типизация + специфические операции над указателями, поэтому над ними действуют точно такие же правила передачи в функции, как и над скалярными переменными
Yandex
Объявления
10.03.2012, 19:04     Почему не возвращается значение через указатель из метода класса?
Ответ Создать тему
Опции темы

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