我编写了一个类,其中对象和类属性是不可变的 - 但每次我尝试更新类属性时都会出现以下错误;
“未处理的异常......在ConsoleApplication.exe中......堆栈溢出”
关于类对象的一些细节。该类的头文件,
class AnObject {
public:
//constructor
AnObject();
AnObject(
const std::string AttributeA,
const __int32 AttributeB
)
const AnObject AnObject::SetAttributeA(const std::string AttributeA) const;
const AnObject AnObject::SetAttributeB(const __int32 AttributeB) const;
const AnObject AnObject::SetMyAttributes (const std::string AttributeA, const __int32 AttributeB) const;
private:
const std::string AttributeA;
const __int32 AttributeB;
};
类文件
AnObject::AnObject() : AttributeA("1002"), AttributeB(1) {};
AnObject::AnObject( const std::string AttributeA, const __int32 AttributeB) : AttributeA("1002"), AttributeB(1)
{
SetMyAttributes("1002", 1);
};
const AnObject AnObject::SetMyAttributes(const std::string AttributeA, const __int32AttributeB)
const
{
try {
return AnObject
(
// base fields
AttributeA, AttributeB
)
}
catch (exception e)
{
throw e;
}
};
对象是不可变的,因此在通过setter类更改参数时设置所有参数。但是,当我在main中调用方法时,代码会生成错误。
答案 0 :(得分:1)
这是你的构造函数:
AnObject::AnObject( const std::string AttributeA, const __int32 AttributeB)
来电
SetMyAttributes("1002", 1);
再次调用构造函数...
const AnObject AnObject::SetMyAttributes(const std::string AttributeA, const __int32AttributeB) const
{
try {
return AnObject(AttributeA, AttributeB); // recursive call
}
...
SetMyAttributes
似乎是一个无用的函数,因为您的所有数据成员都是const
,并且您按值返回const
个对象。
通常,您只能在构造函数初始化列表中初始化const
数据成员。之后你不能修改它们。
相同的无用适用于这些(除非你有别的东西,超出常规,袖手旁观:
const AnObject AnObject::SetAttributeA(const std::string AttributeA) const;
const AnObject AnObject::SetAttributeB(const __int32 AttributeB) const;
const AnObject AnObject::SetMyAttributes (const std::string AttributeA, const __int32 AttributeB) const;
如果你在谈论一个完全不可变的课程,你就不会有任何制定者。不过,我建议你在这里阅读所有内容:const correctness
。