samedi 5 septembre 2020

C++: convert not from obj1 to obj2, but from obj1* to obj2?

A constructor for MyClass takes a pointer to another such object.

The C++ MyClass is functionally the same as a C "class" based on a typedef'd struct called MyType_T. (The C++ class is basically a wrapper to the old C code.) I'd like to be able to pass in a MyClass* anywhere I could pass in a MyType_T* before.

I'd like to write an automatic conversion of any MyClass* to MyType_T*, but I guess what's throwing me is that my type converter is written to take a MyClass not a MyClass*. Even though I'm sure that's the problem, I can't think of what syntax would solve it. I've thought about making a friend implementation of the cast, but I can't put it before the definition of class MyClass because it won't know the offset of thing. And I can't put after the definition of class MyClass because the MyClass constructor wants to use that conversion.

 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( &thing, iFoo, pclassParent ); <--------------- PROBLEM
        MyTypeCreator( &thing, iFoo, &pclassParent->thing ); <------- WORKS
    };

    operator MyType_T*() { return &thing; } <---------------- INCORRECT: attempts to convert MyClass, not MyClass*, to MyType_T*.

    MyType_T thing;
};

QUESTION 1: how to write a convertor from MyClass* instead of MyClass?

QUESTION 2: how can such a convertor check for NULL input? (If thing isn't offset of 0, but say 8, then converting from a NULL pclass without a check would give a value of 0x00000008, not NULL...)

Aucun commentaire:

Enregistrer un commentaire