Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

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

10.03.2012, 18:16. Показов 2250. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2012, 18:16
Ответы с готовыми решениями:

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

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

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

11
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:37
C++
1
2
3
4
void TestingCPPSyntax::CreateValue(int * pValue)
{
        pValue = new int(1000);
}
Что это собственно значит? ну или какой смысл вы вложили в этот метод?
Если вы хотите по указателю записать число 1000, то попробуйте просто записать так
C++
1
*pValue = 1000;
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:42  [ТС]
Я хотел, чтобы после выхода из метода 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
Смотрите мой пост выше
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:44  [ТС]
Цитата Сообщение от Mustik Посмотреть сообщение
Если вы хотите по указателю записать число 1000, то попробуйте просто записать так
Так не получится, так как изначально указатель null. Вылетает исключение:
Необработанное исключение в "0x778b15de" в "Test.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000".
Добавлено через 23 секунды
Цитата Сообщение от Mustik Посмотреть сообщение
Смотрите мой пост выше
Да я просто не успел ответить, так-то всё видел сразу же.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:45  [ТС]
Походу я чего-то не понимаю или понимаю не так. Видимо передавать в метод указатель указывающий на null нету смысла?
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
10.03.2012, 18:53
Удалено. Бред написал.

Добавлено через 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
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
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:56  [ТС]
Цитата Сообщение от 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
Исправился
*pValue = 1000;
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.03.2012, 18:59  [ТС]
Цитата Сообщение от Luke Посмотреть сообщение
если уж ставишь такие замысловатые эксперименты то передавай укзатель по ССЫЛКЕ в скои методы
А вот оно что. Я думал, если передаёшь скажем просто int, то передаётся копия, если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.03.2012, 19:04
Цитата Сообщение от Casper-SC Посмотреть сообщение
если передаю int* то передаётся указатель как бы по ссылке, что-то подобное я и думал, а оказывается ещё и копия указателя может передаваться.
указатель это всего лишь адрес + типизация + специфические операции над указателями, поэтому над ними действуют точно такие же правила передачи в функции, как и над скалярными переменными
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2012, 19:04
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru