希望这不是重复的。如果是这样,请在评论中指出它,我会再次删除该问题。
我有一个数据对象,其中的数据只在一个包中有效——也就是说,在不使其他成员无效的情况下更改一个成员的值是没有意义的。
这个数据对象描述了一些图像信息:
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/