Damian
Damian

Reputation: 5561

c++ how to write a constructor?

I'm not used to c++ and I'm having a problem writing a constructor.
See this example, is a short version of the code I'm working on:

class B {
public:
  B(int x);
}

class A {
public:
  B b;
  A(){
    // here I have to initialize b
  }
}

That throws a compiler error since I need to initialize b in A's constructor because B does not have a default constructor.

I think I have do it in the initialization list, but the B(int x) argument is a value I have to calculate with some algorithm, so I don't know how this should be properly done, or if I'm missing something or doing it wrong.

In other language like java I would have a reference to B and initialize it inside the A's constructor after the other code I need to get the value for the initialization.

What would be the right way to initialize b in this case?

Thanks!

Upvotes: 2

Views: 5150

Answers (3)

rookieRailer
rookieRailer

Reputation: 2341

#include<iostream>

class B {
    public:
        B(){} // A default constructor is a must, if you have other variations of constructor
        B(int x){}
}; // class body ends with a semicolon

class A {
    private:
        B b;
    public:
        A(){
            // here I have to initialize b
        }
        void write(){
            std::cout<<"Awesome";
        }
};

int main(){
    A a;
    a.write();
}

In C++, if you have a constructor that takes an argument, a default constructor is a must, unlike other languages as Java. That's all you need to change. Thanks.

Upvotes: -1

Jerry Coffin
Jerry Coffin

Reputation: 490128

You use an initializer list, something like this:

A() : b(f(x)) {}

Upvotes: 1

Johannes Schaub - litb
Johannes Schaub - litb

Reputation: 506975

You can invoke functions in your constructor initializer list

class B {
public:
  B(int x);
}; // note semicolon

class A {
public:
  B b;

  A()
  :b(calculateValue()) {
    // here I have to initialize b
  }

  static int calculateValue() {
    /* ... */
  }
}; // note semicolon

Note that in the initializer list, the class is considered completely defined, so you can see members declared later on too. Also better not use non-static functions in the constructor initializer list, since not all members have yet been initialized at that point. A static member function call is fine.

Upvotes: 11

Related Questions