简体   繁体   中英

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!

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.

您使用初始化列表,如下所示:

A() : b(f(x)) {}
#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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM