声明后调用构造函数

时间:2016-07-17 20:18:04

标签: c++

这可能是一个非常基本的问题。如何在变量声明后调用构造函数?例如,这是一个有效的代码:

// in header
class Bar
{
    SomeClass *foo;
public:
    Bar();
}

// in .cpp
Bar::Bar()
{
    foo = new SomeClass(1, 2, 3);
}

但是我怎样才能改变这一点,foo不是指针?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果在类中定义了foo,则使用构造函数初始化列表,如下所示:

class X {
   X() : foo(1,2,3) {}
   SomeClass foo;
};

如果你需要计算foo - s构造函数的参数,那么它就变得更加困难了。您可以添加计算您的值的函数,即:

class X {
   X() : foo(initX(),initY(),initZ()) {}
   SomeClass foo;

   static int initX() { return 1;}
   static int initY() { return 2;}
   static int initZ() { return 3;}
};

但这并不总是可行的 - 也就是说,这取决于你如何计算你的价值。 (静态是有意的,因为你最好不要使用不完全构造的类成员)。

您也可以将这些值作为构造函数参数传递。

答案 1 :(得分:1)

替换

class Bar
{
    SomeClass *foo;
public:
    Bar();
};

Bar::Bar()
{
    foo = new SomeClass(1, 2, 3);
}

...与

class Bar
{
private:
    SomeClass foo;

public:
    Bar();
};

Bar::Bar()
    : foo{ 1, 2, 3 }
{}

答案 2 :(得分:1)

如果你在一个类之外声明它,它将是一个全局变量。要在.cpp文件中构造它,你应该在头文件中声明它extern,然后在cpp中声明它时使用你想要的构造函数

SomeModule.h:

extern SomeClass foo;

SomeModule.cpp:

SomeClass foo(1, 2, 3);

如果它是类的成员变量,那么您可以通过在构造函数的成员初始化列表中显式初始化变量来使用所需的构造函数

OtherClass.h:

class OtherClass
{
    SomeClass foo;
    public:
      OtherClass();
}

OtherClass.cpp:

OtherClass::OtherClass() : foo(1, 2, 3) {};

如果想要在代码中间进行初始化,就像使用指针大小写一样,那么你可以让它用默认的构造函数进行初始化,并将值与你想要的值一起复制到指针所在的位置。

foo = SomeClass(1, 2, 3);