2012-07-05 52 views
1

如何实现此行为?在另一个类中声明一个具有非默认构造函数的类

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

class B 
{ 
    A a; // here is the problem 
public: 
    B() : a(1) {} // solution i found 
}; 

int main(void) 
{ 
    B b; 
    return 0; 
} 

我想知道是否有另一种方式使这项工作,除了我发现的答案。

+1

注意:一个构造函数可以接受单个参数通常更好地标记为“显式”。 – 2012-07-05 17:26:56

回答

4

不,这是正确的解决方案。你明确陈述你不希望它可以初始化A没有参数,所以这个结果不应该让你感到惊讶。

或提供x默认:

class A 
{ 
    int x; 
public: 
    A(int x = 1) : x(x) {} 
}; 

使其成为一个默认的构造函数。

2

添加第二个,默认构造函数答:

class A 
{ 
    int x; 
public: 
    A(int x) : x(x) {} 
    A() : x(1) {} 
}; 
2

是,在C++ 11,你可以只写:

class B 
{ 
    A a(1); //C++11 support this! (though the compilers may not, now) 
public: 
    B() {} //nothing here! 
}; 

还是这个,

A a{1}; //using uniform initialization 
0

您应该记住,当您明确添加一个构造函数时,将不会自动创建默认构造函数。它是一个唯一的默认构造函数。复制构造函数将被创建。

还记得三个规则的:

3(也称为三巨头或三巨头法)的规则是,权利要求以C++经验法则,如果一个类定义以下是可能应该明确定义的一个所有三种[1]:

destructor 
copy constructor 
copy assignment operator 

>

0

我相信你已经知道这一点,但你可以做“一个”指针一个A类型的对象:它允许你控制对象何时被实例化,因此在运行时可以传入A构造函数的值(明显需要删除)

相关问题