пользовательские конструкторы для встроенных типов в Stack Overflow

Предположим, я определил класс с именем 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(); но это кажется неуклюжим.)

0

Решение

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

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

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 выражение) вызывающая сторона должна явно освободить эту память, чтобы избежать утечки памяти.

1

Другие решения

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

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

int *p = (int*)my_entity;
0

По вопросам рекламы [email protected]