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 *mpMyInfo;我想避免堆。)小智 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 实例一样长。