【问题标题】:Constant pointer to array as class field C++指向数组的常量指针作为类字段 C++
【发布时间】:2015-12-05 12:22:21
【问题描述】:

所以我想在我的类中有一个常量指针作为字段,因为它必须始终指向第一个单元格。问题是我不能这样做,因为我在构造函数中分配内存。我在考虑初始化列表,但分配的内存取决于参数的大小;在 C# 中,我会使用 ,,readonly''。不知道如何在 C++ 中做到这一点

class Package{
    private: char *const pack ; // <-- here

    public: Package(PackInfo pckInfo, Data file) ;
    public: ~Package();
};

Package::Package(PackInfo pckInfo, Data data){

    this->headerSize = sizeof(pckInfo);
    this->sizeOfData = data.GetDataSize();

    //alocate memory
    this->pack = new char[this->sizeOfData + this->headerSize](); //<- can not be done
    //pointer on the begining of allocated array
    PackInfo *temp = (PackInfo*) this->pack;
    //putting header information in the begining of the array  // moving pointer at cell just after header information
    *temp = pckInfo; temp++; 
    char *packPointer = (char*)temp; 
    //getting data from file direclty into the array
    data.GetCurrentBytes(packPointer);
}

【问题讨论】:

  • 为什么做不到? : pack(new char[sizeof(pckInfo)+data.GetDataSize()])
  • 实际上如果在类定义中的 headerSize 和 sizeOfData 之后声明了 pack,您可以同时设置它们,然后毫无问题地分配数组,例如:headerSize(sizeof(pckInfo)), sizeOfData(..),包(新字符[headerSize+sizeOfData])
  • omg,我试过了,但似乎我做错了,我认为不能这样做。谢谢!!!!
  • 一般来说,您不能将对象二进制转储到文件并返回并期望它能够正常工作。

标签: c++ pointers


【解决方案1】:

我在考虑初始化列表,但分配的内存取决于参数的大小;

这并不妨碍你:

Package::Package(PackInfo pckInfo, Data data):
    headerSize(sizeof(pckInfo)),
    sizeOfData(data.GetDataSize()),
    pack(new char[this->sizeOfData + this->headerSize]())
{
    // … 
}

只需确保在类定义中headerSizesizeOfData 都在pack 之前声明:成员初始化顺序与它们在类主体中的声明顺序相同。

【讨论】:

    【解决方案2】:

    要在构造函数中初始化某些常量,请使用成员初始化器列表,例如

    Package::Package(PackInfo pckInfo, Data data)
        : pack = new char[required_size_here]
    {
        //... as you were
    }
    

    您需要确保在使用之前设置好尺寸。留给读者作为练习。

    【讨论】:

    • 您在回答之前阅读了所有问题吗?我已经知道了,但是正如您所见,在调用构造函数之前,我要分配的内存是未知的。它是传递给构造函数的参数的大小。
    • zenith 已经为你拼出来了
    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多