3

我有一个工厂类,它将用于创建某个类的大量实例。创建过程非常混乱,可能需要相当长的时间。所以我认为存储已经在工厂内创建的类的实例会很聪明,我可以稍后再回忆它们。

创建取决于单个参数(名称),因此可以将内容存储在std::map我称之为old_instances.

A A_factory::make_A(std::string const& name)
{
    if ( old_instances.find(name) != old_instances.end() )
    {
        return old_instances.find(name) -> second;
    }
    else
    {
        // obfuscated creation process that creates instance 'new_A'
        // ...

        old_instances.insert(std::pair<std::string, A>(name, new_A)); // <- problem
        return new_A;
    }
}

这里的问题是整个例程可能是const工厂的成员。但因为old_instances是改编的。

我有点尴尬const,为了这样微不足道的事情而牺牲函数的特性。这些牺牲合乎逻辑吗?

如果这个问题太依赖口味,请不要拍我。

4

2 回答 2

3

这是使用mutable. 只要外部行为确实是 const 的行为,您应该可以这样做。

于 2012-09-02T19:37:13.427 回答
0

这取决于您 - 如果您认为 old_instances 的状态不会对您的类的客户端代码产生任何可观察/概念上的差异,那么您可以使其可变,并使工厂函数 const。但是你真的应该确保它是真实的,否则你只会让你自己或其他人在以后阅读你的代码时感到困惑。

于 2012-09-02T19:26:43.800 回答