C : конвертировать не из obj1 в obj2, а из obj1 * в obj2?

#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 нет способа сделать указатель одного типа неявно конвертируемым в другой несвязанный тип указателя.