Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
1

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

10.03.2012, 18:16. Показов 1874. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот решил проверить поведение указателя в программе (я только учу 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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2012, 18:16
Ответы с готовыми решениями:

Вызов метода класса через указатель на ноль
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе:...

Вызов метода производного класса через указатель на базовый класс
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при...

Как получить значение из метода класса, если метод возвращает указатель?
Всем привет. Как получить значение из метода класса, если метод возвращает указатель? Вот тут я...

Почему возвращается нулевой указатель?
Всем привет. Не могу понять из за чего внутри метода указатель корректно присваивается, видно что...

11
58 / 58 / 6
Регистрация: 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;
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:42  [ТС] 3
Я хотел, чтобы после выхода из метода TestPointerBehavior, указатель pTest содержал значение, которое было ему присвоено внутри TestingCPPSyntax::CreateValue.

Добавлено через 37 секунд
Чтобы далее код вывел значение 1000:
C++
1
cout << "tester.TestPointerBehavior(pTest);  pTest = " << *pTest << endl;
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:44 4
Смотрите мой пост выше
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:44  [ТС] 5
Цитата Сообщение от Mustik Посмотреть сообщение
Если вы хотите по указателю записать число 1000, то попробуйте просто записать так
Так не получится, так как изначально указатель null. Вылетает исключение:
Необработанное исключение в "0x778b15de" в "Test.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000".
Добавлено через 23 секунды
Цитата Сообщение от Mustik Посмотреть сообщение
Смотрите мой пост выше
Да я просто не успел ответить, так-то всё видел сразу же.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:45  [ТС] 6
Походу я чего-то не понимаю или понимаю не так. Видимо передавать в метод указатель указывающий на null нету смысла?
0
58 / 58 / 6
Регистрация: 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 );
1
40 / 40 / 7
Регистрация: 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;//не забываем удалять
}
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:56  [ТС] 9
Цитата Сообщение от Mustik Посмотреть сообщение
*pValue = new int(1000);
Это вообще не компилируется.

IntelliSense: значение типа "int *" нельзя присвоить сущности типа "int"
error C2440: =: невозможно преобразовать "int *" в "int"
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:57 10
Исправился
*pValue = 1000;
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:59  [ТС] 11
Цитата Сообщение от Luke Посмотреть сообщение
если уж ставишь такие замысловатые эксперименты то передавай укзатель по ССЫЛКЕ в скои методы
А вот оно что. Я думал, если передаёшь скажем просто int, то передаётся копия, если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.03.2012, 19:04 12
Цитата Сообщение от Casper-SC Посмотреть сообщение
если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
указатель это всего лишь адрес + типизация + специфические операции над указателями, поэтому над ними действуют точно такие же правила передачи в функции, как и над скалярными переменными
1
10.03.2012, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2012, 19:04
Помогаю со студенческими работами здесь

Почему не сохраняется значение переменной класса из метода?
Есть переменная count. Есть ситуация, в которой когда объект перетаскивается на назначенное поле на...

Из метода возвращается не ожидаемое значение
Есть код (представлена только его часть) if GameMap.Mode == MOVE: # вычисление текущего угла...

Передать значение из одного класса в другой через указатель
Я не могу додуматься что тут не так class Car { private: int weight; public: Car(int w)...

При вызове метода не возвращается значение. (вызов a.result)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru