none
У меня проблема с доступом к private членам управляемого класса... RRS feed

  • Вопрос

  • Проблема такая. Когда я пытаюсь изменить private данные в ref классе через public метод компилятор выдаёт следующее:
    "Необработанное исключение типа "System.NullReferenceException" произошло в MyProject.exe
    Дополнительные сведения: В экземпляре объекта не задана ссылка на объект."

    Вот класс:

    ref class HashTable { public: HashTable(void); ~HashTable(void); void MakeTable(); void AddNode(OtherClass^); private: unsigned HashFunc(String^); // Метод, в котором вылетает исключение unsigned short hashOperand; // значение этого я пытаюсь изменить в том методе array <OtherClass^> ^TABLE; unsigned sizeTable; };

    Переменные sizeTable и hashOperand инициализируются в конструкторе.

    Вот реализация метода, в котором вылетает исключение:

    unsigned HashTable::HashFunc(String ^key)
    {
        unsigned index, keySize, count=0;
     
        keySize = key->Length;
        key = key->ToLower();
        
        for(unsigned i = 0; i < hashOperand  &&  i < keySize; i++) // ТУТ ВЫЛЕТАЕТ ИСКЛ.
            count += (unsigned short)key[i];
        index = count % sizeTable;
     
        return index;
    }

    Что делать?

Ответы

Все ответы

  • Добрый день.

    Судя по сообщению о ошибке, у вас неинициализирована одна из переменных. Поставьте в метод точку останова и попробуйте выполняя в пошаговом режиме посмотреть, в какой из переменных вместо значения у вас null.

    Отвечающий
  • Судя по сообщению о ошибке, у вас неинициализирована одна из переменных.

    Добрый день. 

    Цитирую сам себя: "Переменные sizeTable и hashOperand инициализируются в конструкторе."

    Вот его код:

    HashTable::HashTable(void)
    {
    	hashOperand = 1;
    	sizeTable = 33;
    	TABLE = gcnew array <OtherClass^> (33);
    
    	for(unsigned i = 0; i < 33; i++)
    		TABLE[i] = nullptr;
    }

  • Судя по всему у Вас переменная hashOperand не инициализирована, откуда Вы её получаете?
    Модератор
  • Судя по всему у Вас переменная hashOperand не инициализирована, откуда Вы её получаете?
    Читайте сообщение выше.
  • Не успел прочитать, пока я отвечал, Вы уже ответили, а я этого не видел. Такое бывает.
    Модератор
  • Не успел прочитать, пока я отвечал, Вы уже ответили, а я этого не видел. Такое бывает.
    Это не страшно. Так, чем можете помочь?
  • Посмотрите какое значение в переменной keySize = key->Length;

  • Посмотрите какое значение в переменной keySize = key->Length;

    keySize == 3

  • Я хотел узнать, может в реф-классах надо как-то по особому обращаться к private переменным?

    У меня они изменяются в private-методе, это не страшно?

  • Не никаких особых методов не требуется.

    Код что вы привели работает нормально и не может кидать NullReferenceException. Только если переданный в функцию key будет nullptr.

    На цикле for у вас все переменные инициализированы и они являеются значимыми типами, т.е. они не могут быть nullptr и следовательно не могут вызвать NullReferenceException.

    Отлаживайтесь по шагам. Возможно ошибка в public методе, который вызывает private метод.


    Для связи [mail]

  • Спасибо, я уже нашёл ошибку.

    Забыл выделить память под объект класса.

    • Помечено в качестве ответа Abolmasov Dmitry 8 июня 2012 г. 10:33