我在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(在不违反标准的情况下不能进行任何其他对齐方式)。也就是说,一旦尝试创建具有替换定义的对象,就可能会导致其未对齐的风险,在最佳情况下,这将导致严重的减速,在最坏的情况下,您的程序会崩溃(在最坏的情况下,则是程序崩溃) ,它将在您的测试中起作用,但在实际使用时会失败)。

09-07 06:33