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

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

最佳答案

这是您的构造函数:

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

关于c++ - C++类错误-不可变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37244783/

10-11 18:32