Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带数组的嵌套结构_C++_Initialization_Nested Class - Fatal编程技术网

C++ 带数组的嵌套结构

C++ 带数组的嵌套结构,c++,initialization,nested-class,C++,Initialization,Nested Class,请帮助我创建带有数组的嵌套结构。如何修复此代码 class CMain { public: CMain(); ~CMain(); private: struct { CCheckSum() : BufferSize(500) {memset(Buffer, 0, BufferSize);} const int BufferSize; char

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

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

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

谢谢。

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

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;
不过,您最好还是使用:

struct-CCheckSum
{
CCheckSum():缓冲区(500,0){}
std::vector Buffer;//一个std::vector
//其大小的轨迹
}小缓冲区;

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

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;
不过,您最好还是使用:

struct-CCheckSum
{
CCheckSum():缓冲区(500,0){}
std::vector Buffer;//一个std::vector
//其大小的轨迹
}小缓冲区;

没有与嵌套相关的问题


数组具有恒定的大小。使BufferSize为常量或使用std::vector而不是char[]。嵌套没有问题


数组具有恒定的大小。使BufferSize为常量或使用std::vector而不是char[]。在运行时无法更改数组大小。它应该在编译时就知道了。 您可以在这个用例中使用std::vector。 此外,在编写名为CCheckSum的构造函数之前,应该给出结构名

struct CCheckSum
        {
            CCheckSum() : ....

无法在运行时更改数组大小。它应该在编译时就知道了。 您可以在这个用例中使用std::vector。 此外,在编写名为CCheckSum的构造函数之前,应该给出结构名

struct CCheckSum
        {
            CCheckSum() : ....

即使您声明了代码>缓冲区大小<代码> >代码> const <代码>,但在类范围内,它并不声明编译时常数,它是C++中声明数组大小所需的,但它是一个常数数据成员,一旦在构造函数中设置,就不能再改变实例的生存期。(但对于每个实例仍然可能不同)

两种解决方案: 制造

  • 类范围内的
    缓冲大小
    静态常量
    ,或
  • (仅)
    const
    位于命名空间范围(包括全局范围)

  • 即使您声明了代码>缓冲区大小<代码> >代码> const <代码>,但在类范围内,它并不声明编译时常数,它是C++中声明数组大小所需的,但它是一个常数数据成员,一旦在构造函数中设置,就不能再改变实例的生存期。(但对于每个实例仍然可能不同)

    两种解决方案: 制造

  • 类范围内的
    缓冲大小
    静态常量
    ,或
  • (仅)
    const
    位于命名空间范围(包括全局范围)

  • 但我声明BufferSize为const int。我使用raw buffer,因为我需要对来自网络的原始数据进行一些简单而快速的处理。您也需要将其设置为静态。但我声明BufferSize为const int。我使用raw buffer,因为我需要对来自网络的原始数据进行一些简单而快速的处理。您需要将其设置为静态ll.我打算使用数组,因为我需要用连续的原始数据字节块填充它。Push_back()它会导致重新分配,这是我想要避免的。如果我声明一个500字节的向量,我如何将100、200和200字节的块一个接一个地复制到数组中,而不将它们逐字节地用[]运算符?事实上,仔细想想,
    std::(tr1::)数组
    ,而不是
    std::vector
    ,在这里使用是正确的,因为大小是(应该是)一个编译时常量。有两件事:1)你不会向后推,你已经有了一个500字节的数组。2)向量作为连续内存存储,因此,您可以像使用原始指针数组一样使用它们&缓冲区[0]是指向数组开头的指针,可以在c风格的内存函数中使用。如果他有权访问它,std:(tr1::)数组也是一个不错的选择。如果不是的话,矢量就是一种方法。我打算使用数组,因为我需要用连续的原始数据字节块填充它。向后推()这将导致我想要避免的重新分配。如果我声明了一个500字节的向量,那么我如何将100、200和200字节的块一个接一个地复制到其中,而不使用[]运算符逐字节地放置它们呢?事实上,想想看,
    std::(tr1::)array
    ,而不是
    std::vector
    ,因为大小是(应该是)一个编译时常量。有两件事:1)你不会后退,你已经有了一个500字节的数组。2) 向量存储为连续内存,因此可以像原始指针数组一样使用它们&缓冲区[0]是指向数组开头的指针,可以在c风格的内存函数中使用。如果他有权访问它,std:(tr1::)数组也是一个不错的选择。如果不是,矢量是一条路要走。