2016-07-24 53 views
0
01 class Flugzeug { 
    02 private: 
    03  const unsigned int nr; 
    04  unsigned int sitze; 
    05  static int serienNr; 
    06 public: 
    07  Flugzeug(unsigned int sitze); 
    08  static int getSerienNr(); 
    09 }; 
    10 
    11 static int serienNr = 4700; 
    12 
    13 Flugzeug::Flugzeug(unsigned int sitze) { 
    14 
    15  this->sitze = sitze; 
    16 } 
    17 static int getSerienNr(){ 
    18 return serienNr++; 
    19 } 

我們必須初始化成員「nr」。 如果我把在構造函數的初始值設定項列表中調用靜態屬性或函數

14 this->nr = serienNr++; 

它會告訴我說:

13 error: uninitialized member 'Flugzeug::nr' with 'const' type 'const unsigned int' 
14 error: assignment of read-only member 'Flugzeug::nr' 

好吧,我在初始化列表來初始化呢? 所以我把

13 Flugzeug::Flugzeug(unsigned int sitze) : nr(serienNr++) { 

,它會告訴我:

13 undefined reference to 'Flugzeug::serienNr' 

我想所有的人:

13 Flugzeug::Flugzeug(unsigned int sitze) : nr(serienNr++) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug::serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug->serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug.serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this::serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this->serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this.serienNr) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug::getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug->getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(Flugzeug.getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this::getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this->getSerienNr()) { 
13 Flugzeug::Flugzeug(unsigned int sitze) : nr(this.getSerienNr()) { 

如何初始化const成員與靜態成員或靜態函數?

謝謝 - Enomine

回答

0

解決方案:

#include <iostream> 
#include <cstring> 
using namespace std; 

class Flugzeug 
{ 
private: 
    const unsigned int nr; 
    char *typ; 
    unsigned int sitze; 
    static int serienNr; 

public: 
    Flugzeug(const char *typ, unsigned int sitze); 
    Flugzeug(Flugzeug const &other); 
    ~Flugzeug(); 
    Flugzeug &operator=(Flugzeug const &other); 
    unsigned int getNr() const; 
    void setTyp(char const *t); 
    char *getTyp() const; 
    void setSitze(unsigned int sitze); 
    unsigned int getSitze() const; 
    bool operator==(Flugzeug const &other); 
    bool operator<(Flugzeug const &other); 
    static int getSerienNr(); 
}; 

int Flugzeug::serienNr = 4700; 

char *strdupnew(char const *str) 
{ 
    return strcpy(new char [strlen(str)+1], str); 
} 

Flugzeug::Flugzeug(const char *typ, unsigned int sitze) : nr(serienNr++){ 
    this->typ = strdupnew(typ); 
    this->sitze = sitze; 
} 
Flugzeug::Flugzeug(Flugzeug const &other) : nr(serienNr++){ 
    this->typ = other.getTyp(); 
    this->sitze = other.getSitze(); 
} 
Flugzeug::~Flugzeug(){ 
    delete typ; 
} 
Flugzeug &Flugzeug::operator=(Flugzeug const &other) { 
    this->typ = other.getTyp(); 
    this->sitze = other.getSitze(); 
    return *this; 
} 
unsigned int Flugzeug::getNr() const{ 
    return nr; 
} 
void Flugzeug::setTyp(char const *t){ 
    this->typ = strdupnew(t); 
} 
char *Flugzeug::getTyp() const{ 
    return typ; 
} 
void Flugzeug::setSitze(unsigned int sitze){ 
    this->sitze = sitze; 
} 
unsigned int Flugzeug::getSitze() const{ 
    return sitze; 
} 
bool Flugzeug::operator==(Flugzeug const &other){ 
    return sitze == other.getSitze(); 
} 
bool Flugzeug::operator<(Flugzeug const &other){ 
    return sitze < other.getSitze(); 
} 
ostream& operator<<(ostream &out, Flugzeug const &f) { 
    out << "Nr: " << f.getNr() << endl; 
    out << "Typ: " << f.getTyp() << endl; 
    out << "Sitze: " << f.getSitze() << endl; 
    out << "SNr: " << f.getSerienNr() << endl; 
    return out; 
} 
int Flugzeug::getSerienNr(){ 
    return serienNr; 
} 
+0

析構函數是錯誤的。它應該是'delete [] typ;'而不是'delete typ;'。複製構造函數也是錯誤的,因爲您不復制字符串,您只需指定指針。所以如果其他實例被刪除,那麼這個指針現在會導致未定義的行爲。 – Vallentin

相關問題