2017-05-24 55 views
-4

我不斷收到這個錯誤,我不明白我做錯了:「錯誤:無效的使用不完全類型‘類定做’的」以法getAuftraeg( )我要打印「vpa」列表。請幫幫我!!無效使用不完全類型的「類...」

#include <iostream> 
#include <vector> 

using namespace std; 

class Auftrag; 

class Kunde { 
public: 
    Kunde(Kunde *kunde) { 
     *this = kunde; 
    } 

    Kunde(string s) : name{s}, vpa{} {} 

    void print(){ 
     cout<<this->name<<endl; 
     getAuftraege(); 
    } 

    string getName() const { return name; } 

    void addAuftrag(Auftrag *auftrag){ 
     this->vpa.push_back(auftrag); 
    } 

    void getAuftraege() { 
     for (int i{0};i<vpa.size();i++) 
      cout << this->vpa.at(i)->getID(); 
    } 

    private: 
     string name; 
     vector<Auftrag*> vpa; 
}; 

class Auftrag { 
public: 
    Auftrag(string s) : id{s}, pk{nullptr} {} 

    void print() { 
     cout<<this->id<<endl; 
    } 
    string getID() const { return id; } 
    void setKunde(Kunde *kunde){ 
     this->pk = kunde; 
    } 
    Kunde *getKunde() const; 
    private: 
    string id; 
    Kunde *pk; 
}; 


int main() { 
    // Anlegen: zwei Kunden und drei Auftraege 
    Kunde *k1{new Kunde{"Sepplhuber-Finsterwalder"}}; 
    Kunde k2{"Kurz"}; 
    Auftrag *a1{new Auftrag{"Decke streichen"}}; 
    Auftrag *a2{new Auftrag{"Wand tapezieren"}}; 
    Auftrag a3{"Jalousie montieren"}; 
    Auftrag a4{"Laminat verlegen"}; 
    // Erste Assoziationsrichtung: 
    // aus einem Objekt vom Typ Kunde 
    // zu Objekten vom Typ Auftrag 
    k1->addAuftrag(a1); 
    k1->addAuftrag(a2); 
    k1->addAuftrag(&a3); 
    // Zweite Assoziationsrichtung: 
    // aus einem Objekt vom Typ Auftrag 
    // zu einem Objekt vom Typ Kunde 
    a4.setKunde(&k2); 
    // Alles ausgeben: 
    k1->print(); 
    k2.print(); 
    a1->print(); 
    a2->print(); 
    a3.print(); 
    a4.print(); 
    // Speicher zurueckgeben: 
    delete k1; 
    k1 = nullptr; 
    delete a1; 
    a1 = nullptr; 
    delete a2; 
    a2 = nullptr; 
} 
+5

編譯器如果知道'Auftrag'是否有一個名爲'getID'的方法,如果它看不見'class''定義? –

+1

'* this = kunde;'這應該做什麼?你想實現一個複製構造函數嗎? –

回答

1

將函數定義放在類Auftrag的定義之後。

例如

inline void Kunde ::addAuftrag(Auftrag *auftrag){ 
    this->vpa.push_back(auftrag); 
} 

inline void Kunde ::getAuftraege() { 
    for (int i{0};i<vpa.size();i++) 
     cout << this->vpa.at(i)->getID(); 
} 

編譯器必須知道類Auftrag的定義,以確定它具有這樣的數據成員作爲vpa