1

我在类定义期间遇到结构初始化问题。我知道 C++ 标准不允许在类定义期间定义变量,但static const变量除外。

就我而言,我已经生成了许多结构初始化的 C 代码。此代码(纯 C 代码)中的所有 POD 变量都是全局的。我想让这个 POD 本地化,所以我尝试将此代码包含在一个类中,并且需要解决结构初始化的问题。生成结构的基本示例是:

// generated C-code
struct G { int a; };
G GS = {0};

如果我们尝试把它放在一个类中,我们可以说:

class CL{
public:
    struct G { int a; } GS = {0}; //error
};

我们有一个错误:

error C2059: syntax error : '{'
error C2334: unexpected token(s) preceding '{'; skipping apparent function body

好的。一些变化。

class CL{
public:
    struct G { int a; } GS;
    CL() { GS.a = 0; }
};

工作正常。但就我而言,我有很多包含很多字段的结构。我不想对生成的代码进行很多更改。怎么样static const

class CL{
public:
    static const struct G { int a; } GS; //ok
    static const struct GT { int a; } GST = {0}; //error
};

也许我可以将所有结构作为static const结构并初始化它们?我怎样才能解决我的问题?

4

3 回答 3

0

您可以将静态成员结构的初始化放在 .cpp 文件中,例如:

// cl.h
class CL{
public:
  static const struct G { int a; } GS; 
  };

// cl.cpp
const CL::G CL::GS = {0};
于 2012-10-30T09:21:34.640 回答
0

也许这个解决方案对你来说是可以接受的

// your header
template<typename T> T Create();

#define DECLARE_CREATE(STRUCT_TYPE, INITIALIZER)\
    template<> STRUCT_TYPE Create<STRUCT_TYPE>()\
{\
    STRUCT_TYPE GS = INITIALIZER;\
    return GS;\
}\

// generated C-code
struct G { int a; };
// replace G GS = {0};
DECLARE_CREATE(G, {0});


int _tmain(int argc, _TCHAR* argv[])
{
    G g = Create<G>(); // use initialized structure
    return 0;
}
于 2012-10-30T09:44:50.390 回答
-1

为什么不为结构定义一个构造函数来初始化它。

class CL
{
public:
    CL() {};
    ~CL() {};

    struct G
    {
        int a;
        G() { memset(this, 0, sizeof(G)); }
    };

    G GS;
};
于 2012-10-30T09:26:10.707 回答