c++ - 如何分配具有 const 成员的数据对象?

标签 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;
};

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

class MyImageObject
{
    ...
private:
    ImageInfo mMyInfo;
}

我希望能够在运行时更改 mMyInfo,但只是这样它才会采用新的 ImageInfo(...) 实例。

MyImageObject::Load() 函数中,我想从文件信息中读取这些数据,然后创建一个具有正确集合的 ImageInfo 实例数据:

double ppix = ImageFile.GetPpiX();
...
mMyInfo = ImageInfo(ppix, ...);

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

ImageInfo operator=(const ImageInfo &other)
{
    // no reference to *this
    return ImageInfo(other);
}

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

我正在使用纯 C++。

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

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

最佳答案

我认为您不能拥有非静态的 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;
    }
};

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

关于c++ - 如何分配具有 const 成员的数据对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17044949/

相关文章:

c++ - 如果发生错误则返回错误值,否则继续执行函数

c++ - WSL Ubuntu 20.04.3 错误 : XDG_RUNTIME_DIR not set in the environment

c++ - 在应用程序 : Causes Compile Error 中包含 Ntddvdeo.h

c++ - QHBoxLayout 小部件对齐仅影响第一个小部件

c++ - 涉及 const unique_ptr 的 move 构造函数

angularjs - 如何在 Angularjs 模板中访问常量

php - PHP const无法正常工作?

c++ - 显式 operator= call (T::operator=)

c++ - 引用模板类型的赋值运算符需要非常量重载

c++ - 单元测试拷贝构造函数和赋值运算符