How to initialize a const field in constructor?
C++ConstructorConstantsCtor InitializerC++ Problem Overview
Imagine I have a C++ class Foo and a class Bar which has to be created with a constructor in which a Foo pointer is passed, and this pointer is meant to remain immutable in the Bar instance lifecycle. What is the correct way of doing it?
In fact, I thought I could write like the code below but it does not compile..
class Foo;
class Bar {
public:
Foo * const foo;
Bar(Foo* foo) {
this->foo = foo;
}
};
class Foo {
public:
int a;
};
Any suggestion is welcome.
C++ Solutions
Solution 1 - C++
You need to do it in an initializer list:
Bar(Foo* _foo) : foo(_foo) {
}
(Note that I renamed the incoming variable to avoid confusion.)
Solution 2 - C++
I believe you must do it in an initializer. For example:
Bar(Foo* foo) : foo(foo) {
}
As a side note, if you will never change what foo points at, pass it in as a reference:
Foo& foo;
Bar(Foo& foo) : foo(foo) {
}
Solution 3 - C++
Initializing const members and other special cases (such a parent classes) can be accomplished in the initializer list
class Foo {
private:
const int data;
public:
Foo(int x) : data(x) {}
};
Or, similarly, for parent initialization
class Foo {
private:
int data;
public:
Foo(int x) : data(x) {}
};
class Bar : Foo {
public:
Bar(int x) : Foo(x) {}
};
Solution 4 - C++
You need to initialize foo in the initializer list.
class Bar {
Foo* const foo;
public:
Bar(Foo* f) : foo(f) {...}
};
Solution 5 - C++
Use a reference:
Foo& foo;
Bar(Foo& f) : foo(f) { }
You can then refer to foo
easily in Bar
:
foo.doSomething();
Solution 6 - C++
try: Bar(Foo* xfoo) : foo(xfoo) {}