У меня есть класс в файле AType.h
, и он реализован в AType.cpp.
# include "PrivateType.h"
class AType{
private:
int a, b, c;
PrivateType varX;
public:
...
};
Я хочу использовать класс AType в файле main.cpp
, и мне нужно будет включитьAType.h
, но я хочу избежать включения PrivateType.h
в main.cpp.
Я не могу создать varX
с помощью malloc / new.
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,
Будет ли это работать?