我在AType.h
文件中有一个类,它在AType.cpp中实现。
# include "PrivateType.h"
class AType{
private:
int a, b, c;
PrivateType varX;
public:
...
};
我想在文件
main.cpp
中使用AType类,并且需要包括AType.h
,但是我想避免在main.cpp中包括PrivateType.h
。我无法使用malloc / new创建
varX
。main.cpp必须在编译时知道AType的大小。
当前解决方案:(很糟糕)
1-创建一个程序来打印
sizeof(AType)
。2-更改标题:
# ifdef ATYPE_CPP
# include "PrivateType.h"
#endif
class AType{
private:
# ifdef ATYPE_CPP
int a, b, c;
PrivateType varX;
# else
char data[ the size that was printed ];
# endif
public:
...
};
3-AType.cpp将以:
# define ATYPE_CPP
# include "AType.h"
编辑1
有没有一种方法或工具可以将复杂的结构自动更改为C基本类型?
我不想打开头文件并找到结构。
如果PrivateType为:
struct DataType {
float a, b;
};
class PrivateType {
void* a;
int b;
short c;
DataType x;
... functions
};
AType将更改为:
class AType {
int a, b, c;
struct x {
void* a;
int b;
short c;
struct x2{
float a, b;
};
};
};
我将分别处理复制/平等方法。
我使用GCC或Clang。
编辑2
一个新的解决方案?
这是针对GCC。
1-获取
sizeof(AType)
和__alignof__(AType)
。2-更改标题:
# ifdef ATYPE_CPP
# include "PrivateType.h"
#endif
class AType{
private:
# ifdef ATYPE_CPP
int a, b, c;
PrivateType varX;
# else
char data[ 'the sizeof(AType)' ];
# endif
public:
...
}
# ifdef ATYPE_CPP
;
# else
__attribute__ (( aligned( 'The __alignof__(AType)' ) ));
# endif
3-在AType.cpp中编写所有复制/相等方法。
能行吗
最佳答案
即使您避免了其他人提到的由编译器生成的特殊成员函数的问题,也无法做您想做的事情(因为您排除了动态分配),并且您的“解决方案”通常无法正常工作。一个问题是类型不仅具有大小,而且具有对齐方式。例如,您的真实类包含int
,但是替换类仅包含char
数组。现在在大多数平台上,int
的对齐方式为4(即int
必须位于4字节边界处),而char
的对齐方式为1(在不违反标准的情况下不能进行任何其他对齐方式)。也就是说,一旦尝试创建具有替换定义的对象,就可能会导致其未对齐的风险,在最佳情况下,这将导致严重的减速,在最坏的情况下,您的程序会崩溃(在最坏的情况下,则是程序崩溃) ,它将在您的测试中起作用,但在实际使用时会失败)。