Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать объект класса с параметрами-массивами, Ссылка на объект не указывает на экземпл 
:(
    Опции темы
Elen123321
Дата 18.4.2014, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2011
Где: Беларусь

Репутация: нет
Всего: нет



Необработанное исключение NullReferenceException. Ссылка на объект не указывает на экземпляр класса.
Описание класса:
Код

////////класс Bankom.h
#include "stdafx.h"

#ifndef Bankom_H
#define Bankom_H

class CBankom{
public:

    CBankom () {                                    //конструктор без параметров
        nominals = new int [n];           //enum { n = 3}; в stdafx.h
        amountNom = new int [n];
        givenNomNow = new int [n];
        for (int i = 0; i < n; i++){
            nominals[i] = 0;
            amountNom[i] = 0;
            givenNomNow[i] = 0;
        }
    };        
    ~CBankom () {                                 //деструктор
        for (int i = 0; i < n; i++){
            delete[] nominals;
            delete[] amountNom;
            delete[] givenNomNow;
        }
    };
    CBankom (int *nom,int *amount, int *givenN) {                                //конструктор с параметрами
    for(int i = 0; i < n; i++){
        nominals[i] = nom[i];                                   //дальше этого не идет
        amountNom[i] = amount[i];
        givenNomNow[i] = givenN[i];
    } 


private:
    //int nominals[n];     // номиналы банкнот
    //int amountNom[n];    // изначальное количество банкнот
    //int givenNomNow[n];  // количество выдаваемых банкнот по транзакции текущей карты 
    int *nominals;
    int *amountNom;
    int *givenNomNow;
};

extern CBankom RunBankom;                       //глобальный объект класса

#endif


Код

////////Bankom.cpp

#include "stdafx.h"
#include "Bankom.h"

//CBankom RunBankom = new CBankom( );    //Ошибка    1    error C2440: инициализация: невозможно преобразовать "CBankom *" в "CBankom"    
//CBankom *RunBankom = new CBankom( );    //Ошибка    1    error C2040: RunBankom: "CBankom *" отличается по уровням косвенного обращения от "CBankom"

CBankom RunBankom;                //надеюсь, создается экземпляр класса


Form.h
Код

...
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {  // по нажатию создается объект класса с нужными параметрами
                int Nominals[n] = {50000,100000,200000};
                int Kol[n] = {20,20,20}; /*{Convert::ToInt32(textBox1->Text),
                              Convert::ToInt32(textBox2->Text),
                              Convert::ToInt32(textBox3->Text)};*/
                int GivenN[n] = {0,0,0};
                RunBankom = CBankom::CBankom (Nominals, Kol, GivenN);   //имя массива есть указатель на первый элемент

                this->Close();
             }


Среда vs2010, windows forms. 

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

Добавлено @ 23:41
        i                    0                    int
-        nominals            0x00000000    int*
        *nominals    0    int
-        this    0x003AE54C { nominals=0x00000000 amountNom=0x7646CFBE givenNomNow=0x003AE5A0 }    CBankom*
-        amountNom    0x7646CFBE    int*
        *(*this).amountNom    -1957298293    int
-        givenNomNow    0x003AE5A0    int*
        *(*this).givenNomNow    29907348    int
-        nominals            0x00000000    int*
        *(*this).nominals    0    int



Это сообщение отредактировал(а) Elen123321 - 18.4.2014, 23:43
PM MAIL WWW ICQ   Вверх
Elen123321
Дата 18.4.2014, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2011
Где: Беларусь

Репутация: нет
Всего: нет



Если меняю значения, элементов массива получается 
Необработанное исключение типа "System.AccessViolationException" произошло в bankomat.exe

Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
PM MAIL WWW ICQ   Вверх
feodorv
Дата 19.4.2014, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Elen123321 @  19.4.2014,  00:39 Найти цитируемый пост)
CBankom RunBankom;                //надеюсь, создается экземпляр класса

Толку от этой надежды, если ниже Вы пишете так:
Цитата(Elen123321 @  19.4.2014,  00:39 Найти цитируемый пост)
                RunBankom = CBankom::CBankom (Nominals, Kol, GivenN);

(кстати, где конструктор копирования?)


Если Вам просто нужно переустановить значения массивов для уже созданного экземпляра класса, то в класс можно ввести соответствующую функцию, например
Код

RunBankom.set( Nominals, Kol, GivenN);



Вы же в конструкторе 
Цитата(Elen123321 @  19.4.2014,  00:39 Найти цитируемый пост)
    CBankom (int *nom,int *amount, int *givenN) {  

массивы не аллокировали (в отличие от CBankom ()). И вызов конструктора вида CBankom::CBankom (Nominals, Kol, GivenN) просто создаст новый (временный) экземпляр класса (с неаллокированными массивами!!!). Куда там изначально указывают мусорные значения полей
Цитата(Elen123321 @  19.4.2014,  00:39 Найти цитируемый пост)
    int *nominals;
    int *amountNom;
    int *givenNomNow;

вновь созданного экземпляра класса, одному Богу известно. Записывать или читать по этим неинициализированным указателям категорически нельзя.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Elen123321
Дата 19.4.2014, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2011
Где: Беларусь

Репутация: нет
Всего: нет



   
через RunBankom.Set( Nominals, Kol, GivenN) получилось. Спасибо. Нужно теперь разобраться, как значения массивов Nominals, Kol из файла достать

Только вот... Debug assertion failed
http://s1.ipicture.ru/uploads/20140419/Vjdy6bTs.jpg
PM MAIL WWW ICQ   Вверх
feodorv
Дата 19.4.2014, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Elen123321 @  19.4.2014,  15:58 Найти цитируемый пост)
Только вот... Debug assertion failed

Ну так:
Цитата(Elen123321 @  19.4.2014,  00:39 Найти цитируемый пост)
    ~CBankom () {                                 //деструктор
        for (int i = 0; i < n; i++){
            delete[] nominals;
            delete[] amountNom;
            delete[] givenNomNow;
        }

Зачем здесь цикл по i? Какой смысл?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Elen123321
Дата 20.4.2014, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2011
Где: Беларусь

Репутация: нет
Всего: нет



И правда) не знаю, как скоро бы я обратила на это внимание)

Спасибо

Это сообщение отредактировал(а) Elen123321 - 20.4.2014, 00:21
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.