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

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

10.03.2012, 18:16. Показов 1993. Ответов 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
Эксперт
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
4432 / 2092 / 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
4432 / 2092 / 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
4432 / 2092 / 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
4432 / 2092 / 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
4432 / 2092 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru