声明后调用构造函数

Call constructor after declaration

本文关键字:构造函数 调用 声明      更新时间:2023-10-16

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

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

但是,如何更改foo,使其不是指针呢?

谢谢!

如果您的foo是在类内定义的,则使用构造函数初始值设定项列表,如下所示:

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

如果您需要计算foo构造函数的参数,那么这将变得更加困难。你可以添加函数来计算你的值,例如:

class X {
   X() : foo(initX(),initY(),initZ()) {}
   SomeClass foo;
   static int initX() { return 1;}
   static int initY() { return 2;}
   static int initZ() { return 3;}
};

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

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

如果在类外声明它,它将是一个全局变量。要在.cpp文件中构造它,您可能应该在头中声明它为extern,然后在cpp-中声明它时使用所需的构造函数

SomeModule.h:

extern SomeClass foo;

SomeModule.cpp:

SomeClass foo(1, 2, 3);

如果它是一个类的成员变量,那么你可以通过显式初始化构造函数的成员初始化列表中的变量来使用你想要的构造函数

其他类别h:

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

其他类别.cpp:

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

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

foo = SomeClass(1, 2, 3);

更换

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 }
{}