如何在.hpp / .cpp文件中定义/声明类实例?

时间:2010-01-27 12:15:11

标签: c++ variables instance declaration

我很确定这个问题非常棒,但我不习惯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的构造函数。希望这能澄清这个问题。

4 个答案:

答案 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, ..) {}