c++对象模型的缺点.解决方案是什么?
c++ object model disadvantage. What is the solution?
我正在学习c++。在阅读c++对象模型内部时,我理解了不同的对象模型。
1)简单对象模型。
2)表驱动对象模型。
3) c++对象模型。问题:
"它的主要缺点是需要重新编译未修改的代码,这些代码使用了类的对象,而该类的非静态数据成员已经被添加、删除或修改。"
我理解了上面的陈述。类定义中发生的任何更改使用相同类的源代码需要重新编译。
意味着,在不重新编译的情况下也可以实现相同的效果。怎么做呢?如果有人能提供样例代码,那就太好了。我在Linux/Ubuntu中使用g++。
在修改类时防止重新编译的典型习惯用法是PImpl。
http://en.wikipedia.org/wiki/Opaque_pointer C.2B.2B
在其他语言/对象模型中可能有方法实现相同的功能,但在c++中没有。否则,这就不是c++对象模型的缺点了。
然而,减轻后果是可能的,例如:(1)只导出库中的接口,也就是纯抽象类;(2)从不更改已发布的接口。如果必须添加新的API,则通过新的接口导出它(即使它引用的是旧的/修改的实现类)。
我不确定代码示例会有多大帮助。这不是一种编码技术。如果你知道什么是纯抽象类,你就知道了。
请注意,在头文件中公开实现细节可能有好处,但缺点是在细节发生变化时强制重新编译;函数可以更容易地内联,这可以提高运行时性能。你需要决定在什么地方,什么时候,这种取舍是值得的。
通过引入额外的间接层,可以将所有私有实现细节隐藏在源文件中。一种常见的方法是指针到私有实现(或"pimpl")习惯用法,例如:
// Header file
class Thing {
public:
Thing(...);
~Thing();
// Public interface
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
// Source file
struct Thing::Impl {
// private details
};
Thing(...) : impl(new Impl(...)) {}
~Thing() {}
// Implementation of public interface
另一种可能性是定义一个抽象接口,用一个或多个工厂来创建包含实现的具体实例,例如:
// Header file
class Thing {
public:
virtual ~Thing() {}
static std::unique_ptr<Thing> make(...);
// Pure virtual public interface
};
// Source file
class ThingImpl : public Thing {
// Implementation of public interface
// Private implementation details
};
std::unique_ptr<Thing> Thing::make(...) {
return std::unique_ptr<Thing>(new ThingImpl(...));
}
这两种方法都将所有实现细节放在源文件中,因此当细节发生变化时,只有源文件才需要重新编译。但两者都引入了额外的指针间接和/或间接函数调用,这可能会影响运行时性能。
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- C++集<T> 什么是最合适的解决方案?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 什么是最快的解决方案,用于读/写入哈希映射
- 构建C 插件时的错误,该解决方案是什么
- 从QTcpSocket上的数据流中连续运行复杂算法的最佳Qt线程解决方案是什么
- 正在(在构造函数中)将其包含一个不良设计的指针传递,如果是的,则解决方案是什么
- Qt 创建者,跟踪:不允许操作.什么是永久解决方案
- 暂停和恢复线程的最佳解决方案是什么?
- Windows上的模板有什么问题?解决方案是什么
- 为什么“从'x*'到'y'失去精度”是一个硬错误,什么是适合旧版代码的解决方案
- C++构建一个带有运算符重载的双边树-什么是好的内存解决方案
- C++使用垃圾收集器是矫枉过正,什么是更好的解决方案
- 来自 std::find 的此错误的优雅解决方案是什么
- 为什么通过系统("color YX")更改控制台应用程序中C++颜色不是最佳解决方案?
- 请有人告诉我,而代码,当运行时,打印1而不是3.5作为解决方案
- 为std::function赋值抽象函数——为什么std::ref是一个解决方案
- 无论尝试什么解决方案,ofstream/fstream都不会起作用