【问题标题】:Declare a class member array of structs (C++98)声明结构的类成员数组 (C++98)
【发布时间】:2015-07-13 01:35:10
【问题描述】:

我需要声明一个结构的类成员数组,理想情况下在声明时初始化如下:

class Foo
{
    typedef struct _TMember
    {
        uint16 m_key;
        uint16 m_val;
    }
    TMember;

    TMember m_member_tab[] =
    {
        { 10,    2400},
        { 20,    2500},
        { 30,    2600},
        { 40,    2700},
        { 50,    2650},
    };

    // etc...
};

这可以在传统的 C++(C++11 之前)类头中完成吗?

编辑:如果没有,什么是好的选择?最好将数组作为类成员,否则可以在通用头文件中定义。

【问题讨论】:

  • 您必须牢记naming rules 和单一定义规则,否则它的工作原理如图所示。
  • 在 C++ 标头中使用这些声明时出现此错误:错误:在 '{' 标记之前不允许使用大括号括起来的初始化程序
  • 只有 C++11 以后才允许这样做。
  • 你可以在标题中写static const TMember m_member_tab[5];,在一个.cpp文件中,有表格
  • 也就是说我们需要先知道元素的数量?可以用sizeof( m_member_tab ) / sizeof( TMember ) 之类的东西来完成吗(鉴于数组有很多项目)?

标签: c++


【解决方案1】:

静态类变量过去必须在头文件之外的实现文件中初始化。

对于 C++11,如果静态类变量为 constexpr,则类内初始化有效:

#include <iostream>

class Foo{
  public:
  struct TMember //can't start with an underscore; typedef unecessary in C++
  {
    unsigned short m_key;
    unsigned short m_val;
  };
  constexpr static TMember m_member_tab[]={
    { 10,    2400},
    { 20,    2500},
    { 30,    2600},
    { 40,    2700},
    { 50,    2650},
  };
};
int main()
{
  using namespace std;
  cout<<Foo::m_member_tab[1].m_val<<endl;
}

旧 C++:

#include <iostream>

class Foo{
  public:
  struct TMember //can't start with underscore; typedef unecessary in C++
  {
    unsigned short m_key;
    unsigned short m_val;
  };
  static TMember m_member_tab[5];
};
//End of header, start of implementation 

Foo::TMember Foo::m_member_tab[] = {
    { 10,    2400},
    { 20,    2500},
    { 30,    2600},
    { 40,    2700},
    { 50,    2650},
  };
int main()
{
  using namespace std;
  cout<<Foo::m_member_tab[1].m_val<<endl;
}

【讨论】:

  • 谢谢。但正如我在 Q 中提到的,它可以用传统的 C++(即 C++11 之前)来完成。如果不是,有没有好的选择?
  • 添加了C++98版本。
  • 您不能在 C++98 头文件中包含复杂的数据结构,但您可以在 C++98 类声明中定义整数常量和/或枚举,所以也许您可以以某种方式模拟您的带有这些的表...否则,静态数据必须超出标头,否则您需要更新编译器。
  • 声明时真的需要指定数组大小(5)吗? (c++98版)?
  • 您的 C++98 版本工作正常,谢谢。我刚刚从声明中删除了不必要的数组大小 (5)。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2012-06-22
  • 2016-02-19
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多