c ++类错误 - 不可变

时间:2016-05-15 23:33:59

标签: c++ immutability

我编写了一个类,其中对象和类属性是不可变的 - 但每次我尝试更新类属性时都会出现以下错误;

“未处理的异常......在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中调用方法时,代码会生成错误。

1 个答案:

答案 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