How to initialize a const field in constructor?

C++ConstructorConstantsCtor Initializer

C++ 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) {}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpuccioView Question on Stackoverflow
Solution 1 - C++Jim BuckView Answer on Stackoverflow
Solution 2 - C++SingleShotView Answer on Stackoverflow
Solution 3 - C++ezpzView Answer on Stackoverflow
Solution 4 - C++KeithBView Answer on Stackoverflow
Solution 5 - C++Khaled AlshayaView Answer on Stackoverflow
Solution 6 - C++John LedbetterView Answer on Stackoverflow