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

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

Войти
Регистрация
Восстановить пароль
 
Casper-SC
Эксперт .NET
3522 / 1741 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
#1

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

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

Вот решил проверить поведение указателя в программе (я только учу 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2012, 18:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не возвращается значение через указатель из метода класса? (C++):

Вызов метода класса через указатель на ноль - C++
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе: struct A { int a; void...

Вызов метода производного класса через указатель на базовый класс - C++
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c-&gt;fnz() ...

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

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

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Не удается запустить указатель метода по указателю класса - C++
Первый класс - бесцветная (белая) линия, Второй класс - цветная линия. Если взять два указателя на данные классы и по ним указатель...

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

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

IntelliSense: значение типа "int *" нельзя присвоить сущности типа "int"
error C2440: =: невозможно преобразовать "int *" в "int"
0
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:57 #10
Исправился
*pValue = 1000;
0
Casper-SC
Эксперт .NET
3522 / 1741 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
10.03.2012, 18:59  [ТС] #11
Цитата Сообщение от Luke Посмотреть сообщение
если уж ставишь такие замысловатые эксперименты то передавай укзатель по ССЫЛКЕ в скои методы
А вот оно что. Я думал, если передаёшь скажем просто int, то передаётся копия, если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.03.2012, 19:04 #12
Цитата Сообщение от Casper-SC Посмотреть сообщение
если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
указатель это всего лишь адрес + типизация + специфические операции над указателями, поэтому над ними действуют точно такие же правила передачи в функции, как и над скалярными переменными
1
10.03.2012, 19:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2012, 19:04
Привет! Вот еще темы с ответами:

Указатель на объект в качестве параметра вызываемого метода класса - C++
Код по сути //Interface.cpp #include &quot;Interface.h&quot; void Interface::input() { Teplitsa *kaka; kaka = new Teplitsa; ...

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

Возврат значения метода через указатель - C++
Здраствуйте, помогите зделать что бы возврат результатов с метода решения уравнения возвращался через указатель. #include &lt;iostream&gt; ...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...


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

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

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