我正在寻找一种方法让我的构造函数以这种方式引用另一个对象:
Foo object1("File1");
Foo object2("File1");
第一个对象是正常创建的。第二个对象看到已经有一个对象使用“File1”参数并使自己成为对第一个对象的引用。我知道这可能无法以这种方式直接做到这一点。我保留了一个Foo *的静态向量来跟踪分配的对象。
我知道我可以创建类指针的所有成员,并且对于第一种情况创建(新)它们。在第二种情况下,我不会创建它们并将它们指向第一个对象。此外,第二个对象的寿命比第一个更短。
那么,有一种简单/优雅的方式来做到这一点吗?
编辑:感谢您提供所有出色的解决方案。我喜欢他们,但我只能使用一个。我将保留所有这些知识以供将来参考。
我正在选择static map <string, FooObject*>
解决方案。起初我以为这是愚蠢的,但经过进一步的审查,它吸引我优雅。
我现在能看到的唯一补充是添加一个到FooObject的链接计数器。这种方式在Foo的构造函数中我可以递增链接计数器。在析构函数中,递减计数器。如果计数器为零,则将其从地图中删除。这样就没有内存泄漏,并且对象可以以任何顺序被破坏。我想这种方法是shared_ptr esque。 归功于@Travis。
谢谢,詹姆斯。
答案 0 :(得分:6)
尝试使用static map<string, object*>
作为变量,其中object是您需要的其余类。
答案 1 :(得分:1)
您可以使用资源管理器。它应该有这样的界面:
class ResourceManager
{
public:
Foo* GetFoo(some id type, maybe file name);
void ReleaseFoo(Foo* fooObj);
}
在里面它将搜索是否存在使用相同id的Foo *对象,如新ID,如果退出它将返回旧的Foo *对象,否则它将创建一个类型为Foo *的新对象。它还将计算每个id的Foo *对象的数量。当调用Release函数时,它将减少该id的数量(在唯一的对象中标识),如果它为0,它将删除该对象。
这是执行此操作的最简单方法。你可以让它在另一个线程中运行,以获得更多这种类型的资源和其他东西,但这是基本的想法。
答案 2 :(得分:0)
这听起来像是轻量级http://en.wikipedia.org/wiki/Flyweight_pattern
如果您处于单线程环境中,则可以在类中使用静态std::map<std::string, ObjectImpl*>
并由构造函数使用。您可以使用pimpl模式存储实际的实现,并在创建对象时检查实现是否已经可用。如果是,只需立即设置指针即可。如果您在没有引用的情况下需要清理,可以添加其他代码来处理它。
答案 3 :(得分:0)
您只需要一个返回Foos的工厂方法,并始终将其称为期望引用。 然后将它们存储在静态地图中,并在询问时检查它们。
Foo &file = getmefile("file1");
Foo &file2 = getmefile("file1");
Foo &getmefile(string filename){
if (foos.find(filename) == foos.end() ) {
foos[filename] = Foo(filename);
}
return foos[filename];
}