0

ich versuche processStudent(string myFilename, Student* myArray, int &mySize) eine Reihe von StudentErste Fehler bei dem Versuch, ein Array von Objekt zu einer Funktion zu übergeben

in die Funktion zu übergeben. Aber es gibt mir verschiedene Arten von Fehlern.

Der Student() tut nichts, aber ich versuchte, sie irgendeine Art von Wert zuzuweisen, ist es noch genau die gleiche Fehlermeldung geben:

Im Haupt ich dieses:

// Create an array of students, with the size of theMax (256) 
Student* arrayOfStudent= new Student[theMax]; 

// An integer that will keep track of actually how many students 
// Because when we loop, we want to loop within the cell 
// that actually have data or student. 
int actualSize = 0; 

// Invoke the helper function to set up the array of students 
// It passed the arryOfStudent by reference, so the changes 
// inside of the function will be reflected when it returns 
processStudent(filename, arrayOfStudent, actualSize); 

Die Funktion ist wie folgt:

void processStudent(string myFilename, Student* myArray, int& mySize) 
{ 
    // Something here, but removed still gives that error 
} 

// In der CPP-Datei der Klasse Schüler

Student::Student() 
{ 
    // Nothing here 
} 

Fehlermeldung:

new-host-2:csci135p1 george$ g++ -Wall -o csci135p2main csci135p2main.cpp 
Undefined symbols for architecture x86_64: 
    "Student::Student()", referenced from: 
     _main in cc3fTXti.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Ich habe Strippen und meinen Code Strippe nach unten, aber dieser Fehler geht einfach nicht weg. Ich möchte dieses Array erstellen und an die Funktion processStudent übergeben, damit es beim Lesen der Datei eingerichtet werden kann.

+1

klingt wie ein Verknüpfungsfehler, wie baut man? – Shep

Antwort

1

Sie sollten sich ein paar Fragen stellen, die helfen könnte, Sie:

"Wie erstelle ich neue Instanz von Student?"
Nun, ich mache es wie folgt aus: Student* s = new Student(); - es neue Objekt erstellt und speichert das referrence, um es als Zeiger (Student*)

„Wie erstelle ich ein Array von 10 Student s?“
Nun, es wird wahrscheinlich ein Array von Zeigern auf neue Student s sein, und ich werde wahrscheinlich so nennen habe new mehr als einmal ... durch diese Art und Weise denken Sie am Ende leicht mit etwas würden:

Student** students = new Student*[10]; 
for (int i = 0; i < 10; ++i) 
    students[i] = new Student(); 

... was bedeutet, dass, wenn Sie es reinigen, werden Sie delete auf jedem Student* anrufen müssen und Sie werden das Array selbst aufzuräumen müssen: delete[] auf Student** nennen - und wenn man bedenkt, das hässliche Speicherverwaltung Verbinden mit Array von Zeigern, sollte es Sie suchen nach einfacheren und besseren Möglichkeiten der Implementierung, so sollten Sie am Endeverwenden 10 statt Array, Objekte anstelle von Zeigern, wenn es möglich ist, und wenn es nicht möglich ist, dann benutze intelligente Zeigern statt zumindest nackten Zeigern.

+0

Tolle Erklärung meiner Situation ... wirklich nett. Vielen Dank. Aber natürlich, mit Hausaufgaben des ersten Jahres, ist kein Vektor erlaubt. Aber ich kann mein Problem viel mehr verstehen, und mit den Zeigern umzugehen, ist ziemlich schwierig. – George

+1

Ja, ich verstehe Ihren Standpunkt.Es ist gut, ein Programm wie dieses zu schreiben, um die Grundlagen zu verstehen ... aber die Sache ist, dass Sie erkennen sollten, dass es bessere Wege gibt, wie man programmiert, also gewöhnt euch nicht zu sehr daran :) Ich empfehle euch [ Dieser Vortrag] (http://www.youtube.com/watch?v=OB-bdWKwXsU), insbesondere der Teil, der "Ghastly Style" um 0:12:50 und der Teil "Resources and Errors" um 0:27 heißt : 30 ... es wird dich dazu bringen, mehr darüber nachzudenken;) – LihO

1

Es Fehlermeldung Sie die Antwort sagt:

Student*’ to ‘Student**’

Ändern Sie den Typ des myArray Argument in processStudent():

void processStudent(string myFilename, Student** myArray, int& mySize) 
{ 
} 

Wenn ein Array an eine Funktion übergeben wird es zu einem Zeiger zerfällt :

void some_func(char* b) {...} 

char buf[100]; 
some_func(buf); 

Wenn Sie dieübergebendas Array verfällt zu einem Zeiger, es ist einfach so, dass das Array ein Array von Zeigern daher ** ist.


Der Linker beschwert, dass es nicht die Definition des Default-Konstruktor für Student finden kann. Die Definition ist in der Student.cpp Datei enthalten ist, um alle Quelldateien kompilieren, um den Linker Fehler zu beheben:

g++ -Wall -o csci135p2main csci135p2main.cpp Student.cpp

+0

Sie können immer noch 'myArray [1]' verwenden. – hmjd

1

Der erste Fehler (die sich aus der Frage entfernt worden zu sein scheint, da ich dies schrieb) sagt Ihnen, dass Der zweite Parameter processStudent ist ein Zeiger auf Zeiger, Student**, und kein Zeiger, Student*. Das ist seltsam, da Sie Ihre Deklaration mit einem Student* Parameter zeigen; Sind Sie sicher, dass dies die tatsächliche Deklaration aus Ihrem Code ist? Hast du irgendwo eine andere Erklärung?

Der zweite Fehler ist wahrscheinlich, weil Sie nicht mit der Einheit verknüpfen, die die Definition des Konstruktors enthält. Sie rufen den Compiler mit nur einer Quelldatei (csci135p2main.cpp) auf und ich vermute, dass Sie den Konstruktor in einer anderen Quelldatei definieren.

+0

Ja, der zweite Fehler ist, weil ich meine Quelldatei für meine Klasse O.O nicht aufgenommen habe. Ich kann nicht glauben, wie ich es in den letzten 2 Stunden nicht herausgefunden habe. – George

+1

das bedeutet, dass Sie etwas Ruhe bekommen sollten;) – zmo

0

verwenden Sie besser einen Vektor von Student (bevorzugen Sie Arrays nur mit grundlegenden Typen (int, char ..) und Vektoren für alles andere).

#include <vector> 

std::vector<Student*> arrayOfStudent = new vector<Student*>(); 
/* ... */ 
processStudent(filename, arrayOfStudent, actualSize); 

und

void processStudent(std::string& filename, vector<Student*>& arrayOfStudent, int& actualSize) { 
/* ... */ 
} 

Ich bin mir nicht sicher, ob das Ihr Problem lösen würde, aber zumindest das ist eine bessere Nutzung ...

+0

kann 'vector' nicht verwenden, aber danke .. – George

+2

' std :: vector 'ist ein Rezept für" leaktrocity ". Verwenden Sie 'std :: vector ' mit 'Student', der die _move-Semantik_ implementiert, oder' vector > 'oder' vector > '. –

+0

Entschuldigung, du hast Recht;) – zmo

0

Ihr Code ist fehleranfällig, schwer zu wartende Ausnahme - unsicher C++. In modernen C++, sollten Sie std::vector<Student>, mit Student Klasse Umsetzung bewegen Semantik oder vector<shared_ptr<Student>> oder vector<unique_ptr<Student>> bezogen auf das Eigentum (gemeinsam oder nicht) Ihrer Student-Instanzen verwenden.

Und Ihre Funktion Prototyp so sein sollte, wenn Schüler Array ein Ein-/Ausgabeparameter ist:

void processStudent(const std::string & filename, std::vector<Student> & students); 

Stattdessen, wenn die processStudent Funktion das Array von Studenten erstellt (zB basierend auf dem Inhalt der Datei), gib es einfach als Rückgabewert zurück (das ist sehr effizient dank der Semantik zum Verschieben):

std::vector<Student> processStudent(const std::string & filename);