2017-07-24 4 views
0

Objekt von Adresse zu machen und zu versuchen, sich darauf beziehen funktioniert nichtC++ Objekte als Klassenmitglieder

Student::Student(string studentInfo_c){ // student constructor 
     stringstream ss(studentInfo_c); 

     getline(ss, lastName, ','); 
     getline(ss, firstName, ','); 
     getline(ss, address1, ','); 
     getline(ss, address2, ','); 
     getline(ss, city, ','); 
     getline(ss, state, ','); 
     getline(ss, zipCode, ','); 


     Address sAddrs(address1, address2, city, state, zipCode); 



    } 

     ostream& operator<<(ostream& os, const Student& s){ os << s.lastName << ", " << s.firstName << " " << s.aAddrs; 
     return os; // first place that sAddrs oject is referenced 
    } 

Klasse Prototypen:

class Student { 

    private: 

    string line; 

    string lastName; 
    string firstName; 
    string address1; 
    string address2; 
    string city; 
    string state; 
    string zipCode; 
public: 
    //Student() : Address aAddrs this didnt work... 
    Student(string studentInfo_c); 
    string get_firstName(); 
    string get_lastName(); 
    void set_address(string address1_f, string address2_f, string city_f, string state_f, string zipCode_f); 

    friend ostream& operator<<(ostream& os, const Student& s); 

    ~Student(); 

}

Fehler: In Funktion std‘ :: ostream & operator < < (Std :: ostream &, const Student &) ': | C: \ Benutzer \ Chris \ Dokumente \ Sommer 2017 Semester \ HeapOStudents \ student.cpp | 67 | Fehler: 'const class Student' hat kein Mitglied mit dem Namen 'aAddrs' |

C: \ Benutzer \ Chris \ Dokumente \ Sommer 2017 Semester \ df \ student.cpp | 73 | Fehler: 'aAddrs' wurde in diesem Bereich nicht deklariert |

|| === Build fehlgeschlagen: 6 Fehler (s), 0 Warnung (en) (0 Minute (n), 0 Sekunde (n)) === |

p.s. Ich weiß, dass dies ähnlich zu anderen Fragen ist, aber keiner von ihnen schien für mich zu arbeiten, sie sind etwas fortgeschrittener.

Dank,

+2

Zeigen Sie tatsächlichen Code und tatsächliche Fehlermeldungen an; Beschreibe sie nicht in Prosa. Ihr Beispiel ähnelt nur entfernt C++ und macht wenig Sinn. –

+0

Pseduocode wird nicht helfen, das Problem zu lösen. Veröffentlichen Sie den tatsächlichen Code. – CinCout

+0

'Adresse sAddrs (Adresse1, Adresse2, Stadt, Staat, Postleitzahl);' Wenn 'sAddrs' ein Klassenmitglied von' Student' ist, dann müssen Sie möglicherweise Initialisierungsliste verwenden –

Antwort

0

Nach Empfehlungen in den Kommentaren, montierte ich ein MCVE zu zeigen, wie es getan werden könnte:

$ g++ -std=c++11 -o test test.cc 

$ ./test 
Student Doe, John 
Address: 
    Address 1: 1 Anyway 
    Address 2: 
    City  : Anytown 
    State : Anystate 
    Zip Code : 12345 


$ 

Hinweise:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

class Address { 
    private: 
    string address1; 
    string address2; 
    string city; 
    string state; 
    string zipCode; 
    public: 
    // default constructor (leaving contents empty) 
    Address() { } 
    // constructor. 
    Address(
     const string &address1, const string &address2, 
     const string &city, const string &state, 
     const string &zipCode): 
     address1(address1), address2(address2), 
     city(city), state(state), zipCode(zipCode) 
    { } 

    friend ostream& operator<<(ostream& os, const Address &a); 
}; 

ostream& operator<<(ostream& os, const Address &a) 
{ 
    return os 
    << " Address 1: " << a.address1 << endl 
    << " Address 2: " << a.address2 << endl 
    << " City  : " << a.city << endl 
    << " State : " << a.state << endl 
    << " Zip Code : " << a.zipCode << endl; 
} 

class Student { 
    private: 
    string lastName; 
    string firstName; 
    Address sAddrs; 

    public: 
    // constructor. 
    Student(const string &studentInfo_c); 

    friend ostream& operator<<(ostream& os, const Student &s); 
}; 

Student::Student(const string &studentInfo_c) 
    // all members are default constructed (leaving them empty) 
{ 
    stringstream ss(studentInfo_c); 
    getline(ss, lastName, ','); 
    getline(ss, firstName, ','); 
    string address1, address2, city, state, zipCode; 
    getline(ss, address1, ','); 
    getline(ss, address2, ','); 
    getline(ss, city, ','); 
    getline(ss, state, ','); 
    getline(ss, zipCode, ','); 
    sAddrs = Address(address1, address2, city, state, zipCode); 
} 

ostream& operator<<(ostream &os, const Student &s) 
{ 
    return os 
    << "Student " << s.lastName << ", " << s.firstName << endl 
    << "Address: " << endl 
    << s.sAddrs << endl; 
} 

int main() 
{ 
    string sample("Doe,John,1 Anyway,,Anytown,Anystate,12345,"); 
    Student s(sample); 
    cout << s; 
    return 0; 
} 

mit g ++ getestet

  1. Address stellt zwei Konstruktoren zur Verfügung: einen Standardkonstruktor und einen zweiten zur Initialisierung.

  2. Student::Student Konstruiert alle Mitglieder mit Standardkonstruktoren. (Daher hat man Address zu liefern.)

  3. Im Körper Student::Student eine temporäre Instanz des Address erstellt und an Student::sAddrs zugeordnet. Dies funktioniert, weil der Zuweisungsoperator (Address& Address::operator=(const Address&)) vom Compiler generiert wird. (Dies ist nicht der effizienteste Code, aber der mit dem geringsten Quellcodeaufwand.)

+0

Ahh, ich verstehe. Ich muss nicht alle Mitglieder in Student initialisieren. Danke für die Hilfe @Scheff. Wie kann ich Ihnen Guthaben zuweisen? – thisissparzo

+0

@thisisparzo Mitglieder werden immer mit jedem Konstruktor des resp. Klasse - entweder explizit oder implizit. (Wenn Sie es nicht in Ihrem Code tun, wird der Compiler das für Sie tun). Implict-Konstruktion funktioniert nur für Member mit Standardkonstruktor. (Andernfalls erhalten Sie einen Compilerfehler.) Btw. [SO: Help Center> Asking] (https://stackoverflow.com/help/someone-answers) erklärt, wie man "Guthaben zuweisen" kann. – Scheff

+0

@thisissparzo Ich habe "construct" anstelle von "initialize" verwendet, da es einen Unterschied für [POD] (http://en.cppreference.com/w/cpp/concept/PODType) gibt ("plain old data"). In älteren Standards ließ die implizite Konstruktion von POD-Elementen sie leer (d. H. Nicht initialisiert). In der Vergangenheit habe ich "hässliche" Bugs bekommen, als ich vergessen habe, z. ein 'Bool'-Mitglied. Seitdem initialisiere ich POD-Mitglieder immer explizit. Dieses Thema wird in [SO: Default, value und zero initialization message] (https://stackoverflow.com/questions/29765961/default-value-and-zero-initialization-mess) und verlinkten Seiten beschrieben. – Scheff