Предположим, я определил класс с именем 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();
но это кажется неуклюжим.)
Ну, нет никакого конструктора для базового указателя — в том смысле, что не существует функции, неявно вызванной для инициализации указателя.
Самое близкое, что вы можете получить — это использовать пользовательскую функцию оператора преобразования.
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
выражение) вызывающая сторона должна явно освободить эту память, чтобы избежать утечки памяти.
Вы не можете сделать конструктор для примитивных типов. Также нет необходимости делать это с помощью конструктора, вы можете просто использовать метод получения, как вы уже упоминали, или функцию, которой вы передаете Entity
а также int
и хранить int
в Entity
,
Также вы можете использовать определяемое пользователем преобразование как сказал @Some программист чувак и сделать что-то вроде:
int *p = (int*)my_entity;