eli*_*yer 2 c++ static-libraries object-slicing
在将源代码编译为.o文件并使用"ar rcs libMyLibrarylib.a*.o"来创建库之后我得到了段错误,因为我使用的是带有成员变量和私有函数的头文件.当我使用完全相同的标题时,我没有得到错误.删除地图中的指针时会发生段错误.
#include <**Type**>
class A
{
public:
A();
~A(); //In the destructor I iterate through the map to free everything before
void function();
private:
void privateFunction();
std::map<**Type**, int*> myMap;
}
Run Code Online (Sandbox Code Playgroud)
class A
{
public:
A();
~A();
void function();
}
Run Code Online (Sandbox Code Playgroud)
没有使用确切的头文件时是否有切片或其他东西?我想隐藏任何使用lib 的#include of Type.
我有库的单元测试,它不是段错误但它使用与编译它相同的头文件.
这是一个不正确的程序,你正在遇到未定义的行为.程序中的翻译单元的类定义必须完全相同 - 根据3.2一个定义规则[basic.def.odr]\6.
要隐藏Type的包含,您可以使用PIMPL惯用语而不是诉诸于这些类型的hacks.
class AImpl;
class A
{
public:
A();
~A(); //In the destructor I iterate through the map to free everything before
void function();
private:
AImpl* pImpl;
}
Run Code Online (Sandbox Code Playgroud)
您只需移动所有逻辑和数据成员,AImpl并尽可能保持公共接口的清洁.而你所需要的只是向前宣言AImpl.