NullReferenceException при ссылке на массив класса

Мой код выглядит следующим образом:

int main()
{
CProfile **profiles;
*profiles  = new CProfile[8];
profiles[0] = new CProfile(2000,2,4);
profiles[1] = new CProfile(55000,6,50);
profiles[2] = new CProfile(758200,5,23);
}

Где CProfile определяется как:

#ifndef PROFILE_H
#define PROFILE_H

class CProfile
{
private:
int m_Experience;
int m_TownhallLevel;
int m_Trophies;
public:
CProfile(void);
CProfile(int,int,int);
void PrintInfo(void);
};
#endif

Кажется, все компилируется нормально, но NullReferenceException возникает во время *profiles = new CProfile[8];, Я новичок в C ++ и не могу понять, как правильно создать экземпляр класса. Любая помощь будет оценена, спасибо.

-1

Решение

Что делает ваш код:

int main()
{
CProfile **profiles; // define a pointer to a pointer-to-CProfile
*profiles  = new CProfile[8]; // you dereference "profiles", but... wait, it was just pointing to anywhere
profiles[0] = new CProfile(2000,2,4); // you are writing into "*profiles" again...
profiles[1] = new CProfile(55000,6,50); // and so on
profiles[2] = new CProfile(758200,5,23);
}

Что вы, вероятно, имели в виду:

int main()
{
CProfile* profiles[8]; // define an array of 8 pointers to CProfile
// assign pointers to unnamed objects to your array
profiles[0] = new CProfile(2000,2,4);
profiles[1] = new CProfile(55000,6,50);
profiles[2] = new CProfile(758200,5,23);
}

В конце концов, я предлагаю спросить себя, могли бы вы пойти с другим дизайном: это строго необходимо для вашего распределения, что CProfiles объекты динамически распределяются new?

Например, вы можете использовать std::vector или же std::array держать ваши профили. Вот что вы действительно могли иметь в виду:

int main()
{
// profiles1 is an array of profiles built without any dynamic allocation
CProfile profiles1[] = { CProfile(2000,2,4), CProfile(55000,6,50), CProfile(758200,5,23)};

// profiles2 is a vector of CProfile;
// the memory holding your objects is dynamically allocated, but your object aren't
std::vector<CProfile> profiles2; // profiles is a container of CProfile
profiles.emplace_back(2000,2,4); // add a CProfile(2000,2,4) at the end of my container
profiles.emplace_back(55000,6,50); // add a CProfile(55000,6,50) at the end of my container
profiles.emplace_back(758200,5,23);
}
5

Другие решения


По вопросам рекламы [email protected]