我很确定这个问题非常棒,但我不习惯C ++。
我有一个用于类定义的.hpp和一个用于类实现的.cpp。我在课堂上有一些私人实例,例如:
class Test
{
Test(void);
private:
SomeClass anInstance;
};
要创建实例并调用构造函数,我必须在类的构造函数中再次定义它吗?
Test::Test(void)
{
SomeClass anInstance(constructor parameters);
}
提前致谢!
编辑:
嗯,对不起,但我没听清楚你在谈论什么,所以让我告诉你一个更好的例子:class A
{
public:
A(int p1,int p2);
}
class B
{
public:
B(A *p1,int p2);
}
class C
{
public:
C(void);
private:
A instanceA;
B instanceB;
}
然后,在C类构造函数的实现中,我想创建instanceA并将其传递给instanceB的构造函数。希望这能澄清这个问题。
答案 0 :(得分:4)
不,您需要一个初始化列表:
Test::Test(void) : anInstance( parameters)
{
}
这适用于固定参数,例如“foobar”或42,但如果需要传入变量参数,则还需要更改Test构造函数定义(以及标题中的声明)。例如,如果需要int来初始化实例,则需要:
Test::Test( int someval ) : anInstance( someval )
{
}
编辑:要在编辑中执行您要求的操作,最好动态创建对象并使用指针。但是,您也可以使用值(使用结构来最小化我的输入工作):
struct C {
int a;
int b;
C() : a(1), b(a) {
}
};
如果这样做,请注意初始化顺序是成员变量在类/结构中出现的顺序,而不是初始化列表中的顺序。
答案 1 :(得分:2)
不,在构建Class
时,将自动初始化类成员。默认(零参数)构造函数将运行。
如果没有这样的构造函数,则需要在类的构造函数initialization list中进行显式调用:
Class::Class()
: anInstance(4711, "w00t!")
{
}
初始化列表是冒号和左括号之间的代码;它是初始化实例成员的地方。此代码在大括号内的代码之前运行。
答案 2 :(得分:1)
首先,在Test的构造函数的声明中不需要void。
如果SomeClass有一些要传递的参数,你可以像这样传递它们:
Test::Test() : anInstance(params)
{
}
答案 3 :(得分:0)
如果你没有对SomeClass对象做任何改动,那么将调用SomeClass的默认构造函数。如果你想用特定的参数调用它,你需要传递这样的参数:
Test::Test(void) : anInstance(arg1, arg2, ..) {}