假设我定义了一个名为Entity
的类,该类具有一个数据成员,该数据成员是一个指向int的指针。例如
class Entity {
public:
int* ptr;
// other stuff
};
是否可以给类型int*
的构造函数一个Entity
对象的构造方法?如果我有一个名为my_entity
的Entity对象,我希望能够执行类似的操作
int* p(my_entity);
或这个
int* p = my_entity;
,这将要求编译器隐式调用int*
的{{1}}的构造函数。
这可能吗? (我知道我可以在Entity类中定义一个公共Entity
方法,并执行类似get_pointer()
的操作,但这似乎很麻烦。)
答案 0 :(得分:1)
好吧,没有基本指针的构造函数-从某种意义上说,没有隐式调用函数来初始化指针。
最接近的是使用用户定义的转换运算符功能
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 :(得分:0)
您不能为基本类型创建构造函数。同样,也不需要使用构造函数来执行此操作,您可以只使用您已经提到的getter,也可以使用将Entity
和int
传递并存储int
到的函数Entity
。
此外,您也可以像某些程序员老兄所说的那样使用user-defined conversion并执行类似的操作:
int *p = (int*)my_entity;