2016-08-11 3 views
0

Ich habe ein Array von Klassenobjekten:Verwirrung über die Einstellung Null-Zeiger

Course* courseList[100]; 

Wenn ich die CourseList auf einen Nullzeiger wollen sie zu, mache ich courseList = nullptr; Aber ich erhalte eine Fehlermeldung für „Ausdruck muss ein modifizierbaren Wert sein.

Für einen Konstruktor meiner Klasse ScmApp

ScmApp::ScmApp() { 
    noOfCourses = 0; 
    courseList_[100] = {}; 
} 

dies ist die Art und Weise alle Elemente courseList_ einstellen nullptr?

+0

Nein, Sie müssen verwenden Sie den gesamten Container-Schleife und jedes Element zuordnen Null-Zeiger zu sein. Wenn diese 'Course * courseList (100, null); 'das gleiche tut. –

+1

"Wenn ich CourseList auf einen Nullzeiger setzen möchte" 'CourseList' ist kein Zeiger, es ist ein Array von Zeigern. Möchten Sie * jedes Element * auf 'nullptr' setzen? –

+2

'Kursliste' ist ein Array. Sie können Arrays nicht auf null setzen, so wie Sie Katzen oder Geschirrspülmaschinen nicht auf null setzen können. Nur * Zeiger * können null sein. –

Antwort

2

Ihre CourseList ist eine Gruppe von 100 Elementen und nicht nur ein einzelnes Element. So können Sie alle 100 iterieren müssen und weisen jedes Element ein null-Zeiger zu sein. Wenn diese Course* courseList[100] = {}; tut das Ding.

+2

Das einzige, was 'Course * courseList (100, nullptr);' does kann nicht kompiliert werden. – molbdnilo

+0

'courseList' ist kein Container, es ist ein Array, deshalb gibt es auch keinen Konstruktor, der 2 Argumente hat. – Rakete1111

+0

Ich habe es gerade überprüft und ihr habt recht. Mein schlechtes @molbdnilo danke –

3

Das einzige, was Sie auf eine nullptr setzen können, ist ein Zeiger.

CourseList ist kein Zeiger. Das ist das Problem. Deshalb können Sie es nicht auf einen Nullzeiger setzen.

CourseList ist ein Array von Zeigern. Was Sie tun können, statt jeden Zeiger in einem CourseList auf einen Null-Zeiger zu setzen:

for (auto &p:CourseList) 
    p=nullptr; 
2
Course * courseList[100] = {}; 

Wenn Sie das Array in Ihrem Konstruktor initialisieren

std::fill(courseList, courseList + 100, nullptr); 

oder std::array<Course *, 100> courseList; verwenden statt Course * courseList[100];

+0

Kannst du einen Blick auf meinen bearbeiteten Beitrag werfen? – Andy

+0

@Andy Sie haben mehrere gültige Antworten für Ihre Frage. Jetzt hast du es versucht ?? –

+0

@Andy, schau dir meine bearbeitete Antwort an –

0

CourseList* courseList[100] erstellt keinen Zeiger auf ein Array, es erstellt ein Array von Zeigern. Je nachdem, was Sie eigentlich wollen, sollten Sie eine der folgenden

Eine Reihe von CourseList s

CourseList courseList[100]; // possibly with = {} 
courseList[0].attr = whatever; // usage 

besser verwenden als oben, aber ähnlich, ein std::array von CourseList s

std::array<CourseList, 100> courseList; // possibly with = {} 
courseList[0].attr = whatever; 

oder in der Nähe zu dem, was es scheint, Sie wollen, einen Zeiger auf einen std::array von CourseList s.Dies ist wahrscheinlich nicht die beste, aber dennoch, hier ist es:

std::array<CourseList, 100>* courseList = nullptr; 
courseList = new std::array<CourseList, 100>{}; // prefer unique_ptr 
courseList->at(0).attr = whatever; 

Wenn Sie nicht wissen, die Größe bei der Kompilierung, oder um das Objekt zu übergeben wollen, ist Ihre beste Wette ist ein std::vector

verwenden
std::vector<CourseList> courseList(100); 
courseList[0].attr = whatever; 

Schließlich würde die weirdest Option sein, um tatsächlich einen Zeiger auf ein Feld zu definieren:

CourseList (*courseList)[100] = nullptr; 

Adressierung der Update: Sie können wie so Standard initializers in Ihrer Klasse verwenden:

class ScmApp { 
private: 
    CourseList* courseList[100] = {}; 
    int noOfCourses = 0; 
}; 

Aber es scheint, als ob Sie eine wachstumsfähige Behälter verwenden sollten, std::vector und push_back Aufruf Kurse immer wieder hinzufügen. Was ich sehe, ist ein sehr schwer zu pflegender Überblick darüber, wer in welcher Klasse ist.

Wenn es unbedingt notwendig ist, dass Sie ein vorhandenes Array nehmen und setzen alles auf nullptr dann können Sie std::fill

std::fill(std::begin(courseList), std::end(courseList), nullptr); 
+0

Hey danke, kannst du dir meinen bearbeiteten Beitrag ansehen? – Andy

+0

@Andy fertig, aber Sie sollten ernsthaft Ihren Ansatz überdenken. –