如何为数据对象分配 const 成员?

Mar*_*ngs 5 c++ constants assignment-operator data-objects

希望这不是重复的。如果是这样,请在评论中指出我,我将再次删除该问题。

我有一个数据对象,其中的数据仅在捆绑包中有效 - 即,在不使其他成员无效的情况下更改一个成员的值是没有意义的。
该数据对象描述了一些图像信息:

struct ImageInfo
{
    ImageInfo(const double &ppix, ...)
        : PpiX(ppix),
        ...
    { }

    const double PpiX;
    const double PpiY;
    const int SizeX;
    const int SizeY;
};
Run Code Online (Sandbox Code Playgroud)

在我的图像对象中,我有一个类型的非常量成员ImageInfo

class MyImageObject
{
    ...
private:
    ImageInfo mMyInfo;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够mMyInfo在运行时进行更改,但前提是它需要一个新的 ImageInfo(...) 实例。

在该MyImageObject::Load()函数中,我想从文件信息中读取此数据,然后ImageInfo使用正确的数据集创建一个实例:

double ppix = ImageFile.GetPpiX();
...
mMyInfo = ImageInfo(ppix, ...);
Run Code Online (Sandbox Code Playgroud)

但我无法编写一个有效的赋值运算符(复制构造函数当然是可能的)。我的解决方案留空mMyInfo,因为我没有引用this

ImageInfo operator=(const ImageInfo &other)
{
    // no reference to *this
    return ImageInfo(other);
}
Run Code Online (Sandbox Code Playgroud)

出于好奇,我想知道这样一个类的赋值运算符应该是什么样子。

我正在使用纯 C++。

编辑
可能的解决方案(目标是保持数据可传输,但一致):

  • 将私有成员与Get...()函数一起使用 -> 简单,但我想避免使用括号。
  • 存储指向 ImageInfo 的指针:(ImageInfo *mpMyInfo;我想避免堆。)
  • 使用序列化并存储序列化的 ImageInfo,然后从序列化的数据创建本地实例。

小智 4

我认为你不能拥有非静态的 const 成员变量。如果您需要随实例更改的 const 变量,您可以执行以下操作:

struct ImageInfo
{
private:
    double myPpiX;
    double myPpiY;
    int mySizeX;
    int mySizeY

public:
    ImageInfo(const double &ppix, ...)
        : myPpiX(ppix),
          PpiX(myPpiX),
        ...
    { }

    ImageInfo( const ImageInfo &other)
    : myPpiX( other.myPpiX),
      PpiX(myPpiX)
     ...
    { }

    const double &PpiX;
    const double &PpiY;
    const int &SizeX;
    const int &SizeY;

    // EDIT: explicit assignment operator was missing
    ImageInfo& operator=(const ImageInfo &other)
    {
        myPpiX  = other.myPpiX;
        myPpiY  = other.myPpiX;
        mySizeX = other.mySizeX;
        mySizeX = other.mySizeX;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

这些值存储在可以在构造时设置的私有变量中,并且它们的值可以通过 const 引用访问。您也不依赖于传递到构造函数中的引用与 ImageInfo 实例一样长。