Пользовательские конструкторы для встроенных типов в C ++ - PullRequest
0 голосов
/ 15 сентября 2018

Предположим, я определил класс с именем Entity, в котором есть элемент данных, который является указателем на int. Так например

class Entity {
public:
    int* ptr;
    // other stuff
};

Есть ли способ дать типу int* конструктор, который принимает объект Entity? Если у меня есть объект Entity с именем my_entity, я бы хотел сделать что-то подобное

int* p(my_entity);

или это

int* p = my_entity;

, что потребует от компилятора неявного вызова конструктора для int*, который принимает Entity.

Возможно ли это? (Я знаю, что мог бы определить публичный get_pointer() метод в классе Entity и сделать что-то вроде int* p = my_entity.get_pointer();, но это кажется неуклюжим.)

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Ну, нет никакого конструктора для базового указателя - в том смысле, что не существует функции, неявно вызванной для инициализации указателя.

Самое близкое, что вы можете получить, это использовать пользовательскую функцию оператора преобразования

class Entity
{
     public:

          operator int *();
};

Entity::operator int *()
{
     // return something appropriate that is of type int *
}


//   sample usage in a function somewhere

int *p = some_entity;    // implicitly conversion that calls the operator int *()

int *another_p = static_cast<int *>(some_entity);    //  explicit conversion

int *yet_another_p = some_entity.operator int *();

Существуют варианты этого, в зависимости от того, какая форма const необходима (например, если операторская функция не изменяет объект, на который она действует, она должна быть const и может быть определена как operator const int *() ).

Необходимо убедиться, что указатель, возвращаемый функцией оператора, обрабатывается надлежащим образом. Если пользовательская операторная функция возвращает элемент some_entity, ее нельзя использовать после прекращения существования some_entity. Точно так же, если он использует динамическое выделение памяти (например, возвращает результат выражения new), вызывающая сторона должна явно освободить эту память, чтобы избежать утечки памяти.

0 голосов
/ 15 сентября 2018

Вы не можете сделать конструктор для примитивных типов.Также нет необходимости делать это с помощью конструктора, вы можете просто использовать метод получения, как вы уже упоминали, или функцию, которой вы передаете Entity и int и сохранять значения int в Entity.

Также вы можете использовать пользовательское преобразование , как сказал @Some программист, и сделать что-то вроде:

int *p = (int*)my_entity;
...