【问题标题】:making a constant array in c++在 C++ 中创建一个常量数组
【发布时间】:2011-05-17 20:07:02
【问题描述】:

codeblocks 是否有任何理由告诉我我无法创建数组?我只是想这样做:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

它给了我

错误:在“{”标记之前不允许使用大括号括起来的初始值设定项

我已经更改了初始化程序的其他部分,但错误总是说同样的事情。这似乎没有意义,因为这是我在 c++ 中学到的第一件事。

【问题讨论】:

  • 我们需要一个出现的上下文(周围的代码)。
  • 这一行,单独编译,编译得很好。请创建一个简短、独立、完整的示例 (sscce.org)。如果没有更多上下文,我们无法告诉您哪里出了问题。
  • 你把它放在你的代码哪里了?它是类/结构的成员吗?它是什么编译器?
  • 它在一个类中,一个私有变量
  • @hotdiggadydang:不一定是整个程序。它应该是一个完整的、minimal 的测试用例来展示问题。有关测试用例的完美示例,请参阅我的答案中的代码 sn-ps。他们展示了您的问题,但只有四/五行长......而不是数百行。让这成为一个教训,没有上下文的单行代码不够

标签: c++ arrays codeblocks


【解决方案1】:

你说你是在一个类中做的,作为一个私有变量。

回想一下(目前),成员变量可能不会在您声明它们的同一个地方初始化(有一些例外)。

struct T {
   std::string str = "lol";
};

不好。它必须是:

struct T {
   std::string str;
   T() : str("lol") {}
};

但是,雪上加霜的是,在 C++0x 之前,您不能在 ctor-initializer! 中初始化数组:

struct T {
   const unsigned int array[10];
   T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};

而且,因为你的数组元素是const,你也不能依赖赋值:

struct T {
   const unsigned int array[10];
   T() {
       for (int i = 0; i < 10; i++)
          array[i] = i; // not possible :(
   }
};

但是,正如其他一些贡献者非常正确地指出的那样,如果您无法修改其元素,那么为T 的每个实例都拥有一个数组副本似乎没有什么意义。相反,您可以使用 static 成员。

因此,以下内容最终将以最好的方式解决您的问题:

struct T {
   static const unsigned int array[10];
};

const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};

希望这会有所帮助。

【讨论】:

  • 当然,只要你使用静态成员变量,你应该可以在类之后初始化数组。
  • @Christopher:从技术上讲,这既不会发生在课程“之前”也不会发生在课程“之后”:P
  • 可能有助于提及“依赖分配”片段无法编译。
  • @Cubbi:哎呀,该死的。谢谢..我很惊讶没有其他人发现这一点!
  • 优秀的答案!很高兴你解释了所有的场景。为此+1。 :)
【解决方案2】:

由于这是一个类中的私有成员变量(根据注释),这在C++03中确实是不允许的。

许多现代编译器部分支持的 C++0x 允许编译以下内容:

class C
{
    const unsigned int ARRAY[10];
 public:
    C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
    C obj; // contains a non-static const member: non-assignable 
}

但是,非静态 const 成员只有在类的不同实例中包含 不同 值时才有意义。如果每个实例都包含相同的{0,1,2,3,4,5,6,7,8,9},那么您应该将其设为static,这也使得在C++98 中可以做到这一点:

class C
{
    static const unsigned int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
    C obj;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多