2011-03-31 100 views
2

我不习惯C++,而且在写一个构造函数时遇到了问题。
看到这个例子,是我工作的代码的短版:C++如何写一个构造函数?

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

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

,因为我需要在构造函数初始化B,因为B没有默认的构造函数抛出一个编译器错误。我想我已经在初始化列表中做了它,但B(int x)参数是一个值,我必须用一些算法来计算,所以我不知道这应该如何正确完成,或者如果我错过了某些东西或做错了。

在像java这样的其他语言中,我会有一个对B的引用,并在我需要获取初始化值的其他代码之后,将它初始化为A的构造函数。

在这种情况下,初始化b的正确方法是什么?

谢谢!

回答

11

您可以调用函数在构造函数初始化列表

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 

注意,在初始化列表中,则该类被视为完全定义,所以你可以看到声明以后太成员。最好不要在构造函数初始化列表中使用非静态函数,因为并不是所有成员都在那个时候初始化。静态成员函数调用很好。

+0

谢谢,这工作。艰难的我认为可能有更好的/更清洁的方式。 – Damian 2011-04-01 00:06:34

+0

还要确保在成员初始值设定项列表中使用的函数不会抛出任何异常。 :) – Viren 2011-04-01 00:20:26

+0

虽然这个作品...它必须是那么可怕?这使得我所有的相关代码都在文件周围混合了。一边的对象构造,另一边的对象配置等等......也许最好有一个默认的构造函数来创建一个不工作的实例,然后在构造函数中创建一个新的实例。你怎么看? – Damian 2011-04-01 03:01:00

1

您使用初始化列表,像这样:

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

在C++中,如果你有一个构造函数的参数,默认构造函数是必须的,不像其他语言如Java。这就是你需要改变的一切。谢谢。

+1

-1:否,不需要默认ctor。 +1表示需要分号。仍然在零... – 2011-03-31 23:33:11