【问题标题】:Static Const Initialised Structure Array in C++ ClassC++ 类中的静态常量初始化结构数组
【发布时间】:2011-06-04 01:16:44
【问题描述】:

我知道如果我想在 C++ 中的类命名空间中使用 const 数组,我做不到:

class c
{
private:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

我必须这样做:

class c
{
public:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

但这要求“p”和“pp”是公开的,而我希望它们是私有的。 C++中没有办法初始化私有静态数组吗?

编辑:-------- 感谢您的回答。另外我希望这个类是一个库,只有头文件,供主项目使用。当被多个文件包含时,包含以下初始化程序会导致“多重定义”错误。

const c::p c::pp[2] =  { {1,1},{2,2} };

我该如何解决这个问题?

【问题讨论】:

  • 除了实际的问题答案之外,在 C++ 中(void) 是不必要且不好的做法,就像class c 什么都不是。你需要有int main() { c varname; return 0; }
  • 谢谢 - 为什么 (void) 是不好的做法?
  • (void) 没有任何害处,但也没有任何好处。支持与 C 的兼容性,但这可能会在未来的版本中改变。

标签: c++ arrays class initialization


【解决方案1】:

您的第一个代码 sn-p 工作正常。您只需将其更改为:

const c::p c::pp[2] =  { {1,1},{2,2} };

【讨论】:

  • 附带说明,他的第二个代码 sn-p 不会按预期工作。 c::pp 在创建和初始化 ::pp 数组时将保持未初始化状态。
  • 用另一个问题编辑 :)
  • @Sam:您应该创建一个新问题,大多数可能已经阅读过此问题的人不会阅读编辑内容,因此您会降低获得答案的机会。
【解决方案2】:

大多数时候你不应该有私有静态成员,从 sn-p 我看到这个也不例外。

相反,您将结构从可见性中完全移除,将其和实例放入您的类函数所在的编译单元的匿名命名空间中。

该类的用户不需要查看实现细节。

一个例外是结构或私有静态成员函数需要访问类的私有成员。如果是这种情况,您至少需要在类头中声明它作为朋友的存在,这样一旦您必须显示它就在那里,通过声明它是静态的,您不会真正失去任何东西。

【讨论】:

  • 我不确定我是否完全理解您的回复,但我认为您的意思是我应该将这些静态成员作为定义函数的 .cpp 文件的局部变量。但是我想要做的(正如您从编辑中看到的那样)是将所有定义保留在头文件中,以允许编译器轻松优化。这个类将被抽象为一个头文件,并且仍然需要初始化 const 数组。
  • 将它们放在头文件中不会使编译器进行优化,但可能会延长编译时间。
【解决方案3】:

您需要使用c:: 限定pp,如

const c::p c::pp[2] = { {1,1},{2,2} };

否则,您会尝试将新数组定义到全局范围,而不是初始化成员。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2013-10-11
    • 2013-07-11
    • 2011-02-08
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多