【发布时间】:2014-06-20 09:55:27
【问题描述】:
我目前有一个声明复制构造函数和析构函数的结构,并保持对 pimpl 对象的引用计数。这允许我通过值传递这个结构。我需要重构它,因为我希望它具有 POD 接口,因为它是库的一部分,现在需要从使用旧 C++ 风格的代码中使用它。 因此,我必须同时删除复制构造函数和析构函数。我不知道在我删除它之后如何保持这种良好的“价值传递”,多重所有权机制。共享指针不是一个选项,因为该结构被用作其他类的方法的参数,从库用户的角度来看,这些类也需要被视为 POD。
struct Foo {
Foo(const Foo&);
const Foo& operator=(const Foo&);
~ Foo();
private:
void* pimpl;
};
struct MainLibrary {
void DoSomething(Foo param);
}
现在的用户代码是这样的:
MainLibrary ml;
{
Foo a;
ml.doSomething(a);
}
此时,a 变量可以在主库中保存很长时间。为了提高效率,Foo 的内部不能每次都被深度复制,这就是为什么 pimpl 实现保留一个引用计数器,每次复制 Foo 的实例时递增,每次销毁 Foo 的实例时递减。
【问题讨论】:
-
"am old C++ flavor" 不支持调用复制构造函数、析构函数?那怎么可能是C++?您应该重新考虑一下,因为您要求的内容相当于“我无法跟踪这些对象,但我需要在它们全部完成后删除其他一些对象” - 如果没有析构函数,您只能尝试链接垃圾收集器。跨度>
-
不,问题是我在整个库中使用 C++11,应该可以通过使用不带 C++11 标志编译的代码链接到它……如果我有非 POD 类型然后我在链接时遇到名称修改错误
-
这是一个非常重要的见解,可以忽略您的问题。在那种情况下,我确信您仍然可以使用一些“胶水”数据和/或函数来使用您当前的设计 - 也许让它们成为外部“C”非成员,以便可以从任何一方调用它们,拥有 C+ +11 代码注册回调,因此 C++11 之前的版本可以找到它需要的函数。还要检查你的编译器文档,看看它们是否提供对名称修改差异的任何控制......
-
抱歉,我没听懂。你能给我一个你在给定示例代码的情况下谈论的功能的例子吗?非常感谢
标签: c++ reference-counting binary-compatibility