gpt4 book ai didi

c++ - 使用静态初始化函数

转载 作者:行者123 更新时间:2023-11-30 04:37:59 25 4
gpt4 key购买 nike

在这个人为设计的示例中,我有一个在构造时运行的静态初始化函数。

我想知道这是否是初始化 a_、b_ 和 c_ 的合法方法。或者,在构建过程中以这种方式使用它们是否为时过早?

DWORD SomeInitializationFunction( HANDLE*, DWORD*, DWORD* );

class MyClass
{
public:
MyClass() : m_( MyClass::Create( &a_, &b_, &c_ ), &::CloseHandle )
{
};

private:

static HANDLE Create( DWORD* a, DWORD* b, DWORD* c )
{
DWORD a1, b1;
HANDLE h;

*c = ::SomeInitializationFunction( &h, &a1, &b1 );
if( *c == 0 )
{
*a = a1;
*b = b1;
return h;
}
return NULL;
};

boost::shared_ptr< void > m_;
DWORD a_;
DWORD b_;
DWORD c_;
};

谢谢,保罗H

最佳答案

类中的成员按照它们在类中定义的顺序进行初始化。因此,如果你有

class A
int t
int u
int v
A() : v(0), u(1), t(2) {}

然后不管你编写构造函数参数的顺序如何,首先会设置 t 的值,然后是 u 的值,最后是 v 的值。

因此,如果您将类的定义顺序更改为:

class MyClass
{
public:
MyClass() : m_( MyClass::Create( &a_, &b_, &c_ ), &::CloseHandle )
{
};

private:

static HANDLE Create( DWORD* a, DWORD* b, DWORD* c )
{
DWORD a1, b1;
HANDLE h;

*c = ::SomeInitializationFunction( &h, &a1, &b1 );
if( *c == 0 )
{
*a = a1;
*b = b1;
return h;
}
return NULL;
};


DWORD a_;
DWORD b_;
DWORD c_;
boost::shared_ptr< void > m_;
};

那么你的构造函数应该没问题。

我建议添加一条评论,说明类成员的初始化存在依赖关系,这样阅读代码的人就知道不要胡乱摆弄。

关于c++ - 使用静态初始化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com