#c 11 #type-conversion
#c 11 #преобразование типов
Вопрос:
Конструктор для MyClass
принимает указатель на другой такой объект.
C MyClass
функционально такой же, как «класс» C, основанный на структуре с определением типа, которая называется MyType_T
. (Класс C в основном является оболочкой для старого кода C.) Я хотел бы иметь возможность передавать в MyClass*
любом месте, где я мог бы передавать в MyType_T*
раньше.
Я хотел бы написать автоматическое преобразование любого MyClass * в MyType_T *, но я думаю, что меня смущает то, что мой конвертер типов написан так, чтобы принимать MyClass
не MyClass*
. Хотя я уверен, что это проблема, я не могу придумать, какой синтаксис мог бы ее решить. Я думал о создании дружественной реализации приведения, но я не могу поместить это перед определением class MyClass
, потому что оно не будет знать смещение thing
. И я не могу поставить после определения, class MyClass
потому что MyClass
конструктор хочет использовать это преобразование.
typedef struct MyStruct {
int iFoo;
struct MyType* ptypeParent;
} MyType_T;
void MyTypeCreator( MyType_T* ptypeSelf, int iFoo_in, MyType_T* ptypeParent );
class MyClass {
public:
MyClass( int iFoo, MyClass* pclassParent ) {
MyTypeCreator( amp;thing, iFoo, pclassParent ); <--------------- PROBLEM
MyTypeCreator( amp;thing, iFoo, amp;pclassParent->thing ); <------- WORKS
};
operator MyType_T*() { return amp;thing; } <---------------- INCORRECT: attempts to convert MyClass, not MyClass*, to MyType_T*.
MyType_T thing;
};
ВОПРОС 1: как написать преобразователь из MyClass* вместо MyClass?
ВОПРОС 2: как такой преобразователь может проверять ввод NULL? (Если значение смещено не на 0, а, скажем, на 8, то преобразование из нулевого pclass без проверки даст значение 0x00000008, а не NULL …)
Комментарии:
1. Вместо того, чтобы иметь член
MyType_T
, иметьMyClass
общедоступную производную отMyType_T
. ТогдаMyClass*
указатель будет неявно преобразован вMyType_T*
указатель.2. @IgorTandetnik хорошая идея, и я рассмотрю! Тем не менее, мне интересно узнать об этом пункте C .
3. В C нет способа сделать указатель одного типа неявно конвертируемым в другой несвязанный тип указателя.