2009-02-27 17 views
0

wie für die Anordnung von stucture Speicher dynamisch zuweisen .... zB:dynamische Speicherzuweisung

class students 
{ 
    struct stud 
     { 
      int r_no; 
      char name[20]; 
     }*s; 
} 

wie Speicher für * s dynamisch zuzuteilen ...

+0

Entschuldigen Sie, aber Ihr Code ist ein wenig lesbar. Könnten Sie es bitte mit der richtigen Einrückung neu anordnen? –

Antwort

2

Warum die zusätzliche Verpackung der struct in einer Klasse mit nichts als einem Zeiger?

in C Wie dem auch sei, würden Sie so etwas tun:

struct stud 
{ 
    int r_no; 
    char name[20]; 
} *s; 

size_t num_students = 4711; 

s = malloc(num_students * sizeof *s); 

Dann würde es klug sein, um durch zu gehen und sicherstellen, dass alle diese individial structs initialisiert, natürlich.

Wenn Sie dies als C++ bezeichnen, sollten Sie Konstruktoren schreiben, die sich darum kümmern, und ein neues [] verwenden, um ein Array von Strukturen zuzuweisen.

+0

Oder Calloc (num_students, sizeof (s)). Vergessen Sie nicht, wenn Sie fertig sind. Wenn Sie im Konstruktor mallociert und im Destruktor freigelassen(), achten Sie auf den standardmäßigen copy_constructor, der dazu führt, dass Sie den gleichen Zeiger zweimal() frei geben. –

+0

True, calloc() funktioniert hier. Ihre Größe hat jedoch zwei Probleme: Kein Stern bedeutet, dass die Größe des Zeigers zugewiesen wird, was in diesem Fall wahrscheinlich 4 anstatt 24 ist. Außerdem hat es ein Paar unnötiger Klammern. :) – unwind

+0

Guter Punkt! Ich wollte sagen Größe (Stud). (Ich mag die Dereferenzierung von S nicht, bevor ihm ein Wert zugewiesen wird, selbst wenn es für die Verwendung mit sizeof zulässig ist.) Was die unnötige Klammer betrifft: Ich mag sie. Ich denke, es macht den Code lesbarer. –

5

Zuerst ist dies nicht die Art und Weise, es zu tun, wie Sie beispielsweise einen Vektor von Stud verwenden könnten. Mit dem Code, wie Sie es haben, wäre es so etwas wie:

class students 
{ 
public: 
    struct stud ... *s; 
    students() // ctor 
    { 
     s = new stud[100]; // say you have 100 students 
     // from now on you can use s[0], s[1], etc. in the class 
    } 
}; 

Doch was sollten Sie Art eines STL-Vektor oder Liste verwenden ist:

class students 
{ 
public: 
    struct stud ... ; 
    std::vector<stud> my_students; 
    students() // ctor 
    { 
     stud aStudent = {0, "Student Name"}; 
     my_students.push_back(aStudent); // add a new student. 
    } 
}; 
+0

2. Beispiel: Warum eine Klasse (Studenten) und einen Vektor verwenden? – dirkgently

+0

Nun ... warum nicht? :) Wir kennen den Kontext nicht. Vielleicht möchte er oder sie den Klassenschülern etwas Funktionalität hinzufügen ... –

+0

Weil der Vektor ein Werkzeug ist, um Daten zu enthalten, aber das Konzept, das wir darstellen wollen (das diese Daten enthält), ist ein Student. Wenn Sie denken, Sie brauchen nur die Daten und Funktionen von Vektor, einfach typef, anstatt es eine Klasse zu machen - Vorsicht vor seiner Verwendung, da alle Vektormanipulationen darauf verfügbar sein werden – Klaim

2

Sie Verwendung von Standard machen sollte Komponenten, wenn Sie können. Hier würden dir std :: string und std :: vector helfen.

struct Student 
{ 
    int r_no; 
    std::string name; 
}; 
typedef std::vector<Student> StudentList; 

Mit einem solchen Ansatz gibt es keinen Grund zu fragen, wie Speicher dynamisch zugewiesen wird. Für alles ist gesorgt!

EDIT:

ich einfach typedef StudentList weil ich, mehr Funktionalität hinzugefügt, um es auf die Frage in keinem Zusammenhang gewesen wäre. ist klar, dass die letzte Zeile mit einer echten Klassendefinition ersetzt werden:

class StudentList 
{ 
    public: 
     // Add your own functionalities here 
    private: 
    std::vector<Student> m_students; 
}; 
+0

Einverstanden. Aber oooh. Ihre Benennungsstrategie. Ich weiß, ich würde Student for Students irgendwo vertippen und es für immer austesten. Etwas wie StudentSet oder StudentVector oder sogar Student_t würde helfen. –

+0

Richtig, ich werde das ändern. Es stört mich nicht, aber ich kann verstehen, warum es geht :) –

+0

@ Benoît: Sie sollten einen Spaten ein Spaten nennen;) Wenn Sie einen Vektor eine Liste aufrufen, kann das zu vielen unangenehmen Überraschungen später im Lebenszyklus eines Produkts führen? – dirkgently

0
class students 
{ 
public: 
    students(size_t noOfStudents):m_noOfStudents(noOfStudents) 
    { 
    s = new stud[m_noOfStudents]; 
    } 

    ~students() 
    { 
    delete s; 
    } 

private: 
    struct stud 
     { 
      int r_no; 
      char name[20]; 
     }*s; 

    size_t m_noOfStudents; 
}