2014-11-26 2 views
1

Я новичок в cplusplus, и я понятия не имею, как сделать неявный тип преобразования между структурами.Неявное преобразование типов с structs

Я хочу сделать следующее:

A a = new __A(); 
Object o = a; 

Я знаю, что для этого требуется оператор перегрузки (я думаю?), И все же, пытаясь реализовать перегрузку операторов было бесполезно. Я использовал примеры в этой статье: http://www.cplusplus.com/doc/tutorial/typecasting/, и все же я не могу получить что-нибудь для работы. Любая помощь будет очень благодарна. Вот макеты моих структур.

typedef __Object* Object; 
typedef __Class* Class; 
typedef __String* String; 
typedef __A* A; 
typedef __Test002* Test002; 

struct __Object { 
    __Object_VT* __vptr; 

    // The constructor. 
    __Object(); 
    // The methods implemented by java.lang.Object. 
    static int32_t hashCode(Object); 
    static bool equals(Object, Object); 
    static Class getClass(Object); 
    static String toString(Object); 

    // The function returning the class object representing 
    // java.lang.Object. 
    static Class __class(); 

    // The vtable for java.lang.Object. 
    static __Object_VT __vtable; 
}; 

struct __A { 
    __A_VT* __vptr; 
    __A(); 
     static __String* toString(A); 
     static int32_t hashCode(Object); 
     static bool equals(Object, Object); 
     static Class getClass(Object); 

    static Class __class(); 

    static __A_VT __vtable; 
}; 
+4

Имена с ведущим подчеркиванием, за которым следует заглавная буква, и два символа подчеркивания (где бы то ни было) являются зарезервированными именами компиляторов. –

+1

'__Object_VT * __vptr;' Что ты делаешь? Если вы новичок в C++, вам действительно нужно найти лучший учебный ресурс, потому что все, что вы сейчас используете, ужасно. – Julian

+0

Почему вы делаете 'typedef __A * A?'? Это действительно ужасно! Скажите, что вы не просто делаете это, чтобы сделать A A a = new A(); 'больше похожи на Java. –

ответ

1

Несколько вещей о коде, публикуемой и ваши цели

  • C++ обрабатывают виртуальный метод отправку вам по наследству, так что нет необходимости вручную варенья виртуальных таблиц в классы
  • Как других упомянутые вы используете недопустимые/зарезервированные идентификаторы
  • Если вы создаете иерархию иерархии с одним корнем (например, в Java или добавляете что-то вроде поддержки отражения), то вы, вероятно, захотите реорганизовать все статические методы класса Object, чтобы они были виртуальными или чистые виртуальные функции-члены, имеют класс A publ ics из класса Object и переопределять эти методы.
  • Ваш прецедент наверху подразумевает, что вы действительно хотите, чтобы иметь указатель на объект класса A, используя класс Интерфейс объекта: это снова виртуальная отправка включена открытое наследование в C++

так что, возможно, что-то вроде следующего

#include <string> 

class Object 
{ 
    /* ... */ 
    public: 
    virtual ~Object() = default; // necessary to avoid slicing 

    virtual std::string toString() const = 0; 

    /* ... */ 
}; 

/* virtual inheritance necessary here if you plan on 
    deriving from multiple classes that derive from Object; 
    otherwise remove */ 
class A : public virtual Object 
{ 
    /* ... */ 

    public: 
    // may or may not be needed, viz., above 
    // virtual ~A() = default; 

    std::string toString() const override { return std::string{ "A" }; } 

    /* ... */ 
}; 

#include <iostream> 
#include <memory> 

int main() 
{ 
    std::unique_ptr<Object> o{ std::make_unique(A) }; 
    std::cout << o->toString() << '\n'; // prints "A" 
} 

там много там так задавать вопросы, если вы сбиты с толку, что я написал (хотя это, вероятно, чтобы получить вне темы быстро).

0

Для этой работы, __A должны наследовать от __Object, как это единственный способ, которым Вы можете присвоить указатель на прежний к одному из последних.

Смежные вопросы