web-dev-qa-db-fra.com

Comment initialiser un champ const dans constructeur?

Imaginez que j'ai une classe C++ Foo et une classe Bar qui doivent être créées avec un constructeur dans lequel un pointeur Foo est passé, et ce pointeur est censé rester immuable dans le cycle de vie de l'instance Bar. Quelle est la bonne façon de procéder?

En fait, je pensais pouvoir écrire comme le code ci-dessous mais il ne compile pas ..

class Foo;

class Bar {
public:
    Foo * const foo;
    Bar(Foo* foo) {
        this->foo = foo;
    }
};

class Foo {
public:
  int a;
};

Toute suggestion est la bienvenue.

65
puccio

Vous devez le faire dans une liste d'initialisation:

Bar(Foo* _foo) : foo(_foo) {
}

(Notez que j'ai renommé la variable entrante pour éviter toute confusion.)

77
Jim Buck

Je crois que vous devez le faire dans un initialiseur. Par exemple:

Bar(Foo* foo) : foo(foo) {
}

En guise de remarque, si vous ne changerez jamais à quoi pointe foo, passez-le comme référence:

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}
18
SingleShot

L'initialisation des membres const et d'autres cas spéciaux (telles que des classes parentes) peut être effectuée dans la liste d'initialisation

class Foo {
private:
   const int data;
public:
   Foo(int x) : data(x) {}
};

Ou, de même, pour l'initialisation des parents

class Foo {
private:
   int data;
public:
   Foo(int x) : data(x) {}
};

class Bar : Foo {
public:
   Bar(int x) : Foo(x) {}
};
14
ezpz

Vous devez initialiser foo dans la liste des initialiseurs.

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};
6
KeithB

Utilisez une référence:

Foo& foo;
Bar(Foo& f) : foo(f) { }

Vous pouvez ensuite vous référer facilement à foo dans Bar:

foo.doSomething();
2
AraK

essayez: Bar(Foo* xfoo) : foo(xfoo) {}

0
John Ledbetter