【问题标题】:nested struct with array带有数组的嵌套结构
【发布时间】:2009-07-28 13:26:02
【问题描述】:

请帮我创建一个带有数组的嵌套结构。如何修复此代码?

class CMain
{
    public:
        CMain();
        ~CMain();

    private:
        struct
        {
            CCheckSum() : BufferSize(500) {memset(Buffer, 0, BufferSize);}
            const int BufferSize;
            char Buffer[BufferSize];
        }SmallBuffer;
}

谢谢。

【问题讨论】:

    标签: c++ initialization nested-class


    【解决方案1】:

    即使您将 BufferSize 声明为 const,在类范围内,它也不会声明编译时常量,这是在 C++ 中声明数组大小所必需的,而是一个常量数据成员,一旦在构造函数,在实例的生命周期内不能再更改(但每个实例仍然可以不同)。

    两种解决方案: 制作

    1. BufferSizestatic const 在类范围内,或
    2. (只是)const 在命名空间范围(包括全局范围)。

    【讨论】:

      【解决方案2】:

      静态数组需要在编译时知道它们的长度,或者你需要动态分配内存:

      struct CCheckSum
      {
          CCheckSum()
          : BufferSize(500),
            Buffer(new char[BufferSize])
          {
              memset(Buffer, 0, BufferSize);
          }
          ~CCheckSum() { delete[] Buffer; } // Note the use of delete[]!
          const int BufferSize;
          char* Buffer;
      }SmallBuffer;
      

      不过,您最好还是使用std::vector

      struct CCheckSum
      {
          CCheckSum() : Buffer(500, 0) {}
          std::vector<char> Buffer;  // A std::vector keeps
                                     // track of its size enternally
      }SmallBuffer;
      

      【讨论】:

      • 我打算使用数组,因为我需要用连续的原始数据字节块填充​​它。 Push_back() 它将导致我想避免的重新分配。如果我声明一个 500 字节的向量,我如何将 100、200 和 200 字节的块一个接一个地复制到其中,而不用 [] 运算符逐个字节地放入它们?
      • 实际上,想想看,std::(tr1::)array,而不是std::vector 是正确的,因为大小是(应该是)编译时常量。
      • 两件事:1)你不会推后,你已经有了一个500字节的数组。 2) 向量存储为连续内存,因此您可以像使用原始指针数组一样使用它们。 &Buffer[0] 是指向数组开头的指针,可用于 c 风格的内存函数。
      • 如果他可以访问它,std::(tr1::)array 也是一个不错的选择。如果没有,矢量是要走的路。
      【解决方案3】:

      没有嵌套相关的问题。

      数组的大小是固定的。要么将 BufferSize 设为常量,要么使用 std::vector 代替 char[]。

      【讨论】:

      • 但我将 BufferSize 声明为 const int。我使用原始缓冲区,因为我需要对来自网络的原始数据做一些简单而快速的工作。
      • 您还需要将其设为静态。
      【解决方案4】:

      数组大小不能在运行时更改。它应该在编译时知道。 您可以将 std::vector 用于此用例。 此外,在编写名为 CCheckSum 的构造函数之前,应给出结构名称。

      struct CCheckSum
              {
                  CCheckSum() : ....
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 2017-04-20
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 2018-01-23
        • 2020-08-23
        相关资源
        最近更新 更多