在构造函数的初始化列表中调用静态属性或函数

时间:2016-07-24 14:05:18

标签: function static initialization const member

    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

1 个答案:

答案 0 :(得分: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;
}