访问指针句柄中对象的地址
Accessing the address of an object in a pointer handle
我正在创建一个指针类,但我无法弄清楚如何返回我的类处理的原始指针的值(指向对象的地址(。我的班级是这样的。
template<typename T>
class Ptr {
public:
Ptr(T t) :p{&t} { }
T* operator->() { return p; }
T& operator*() { return *p; }
T& operator[](int i) { return p[i]; }
private:
T* p;
};
如果我愿意做:
int x = 42;
Ptr<int> y = x;
std::cout << y; //should print the address (y.p).
我绝对不知道重载什么运算符,所以如果我在任何表达式中使用"y",它将返回指向对象的地址,就像原始指针所做的一样。我该怎么办?
首先,你的代码有一个错误。构造函数按值获取t
,这意味着p
将存储临时t
的地址,该地址将在构造函数退出时死亡(指针将变得悬空(。你可能想要这个:
Ptr(T &t) : p{&t} {}
即便如此,这意味着您的指针包装器将由对象而不是指针初始化,这看起来违反直觉。我会更改构造函数以接受T*
.
问如何获取"原始指针的地址",但我假设你真的想要"存储在原始指针中的地址"。
说完这些,让我们转向你的问题。有几种方法可以解决这个问题。
一种是给你的类一个隐式转换为
T*
,像这样:operator T* () const { return p; }
这样,就会存在从
Ptr<T>
到T*
的隐式转换,编译器将在必要时使用它,但这可能比您想要的要多一点。更受限制的版本是使转换显式
:explicit operator T* () const { return p; }
现在,您必须显式转换为指针:
std::cout << static_cast<int*>(y);
您可以遵循
std
智能指针使用的模式,并提供get()
函数:T* get() const { return p; } std::cout << y.get();
最后,如果您只想要此功能进行流式传输,则可以为类重载
operator<<
:template <class T, class Char, class Traits> std::basic_ostream<Char, Traits>& operator<< (std::basic_ostream<Char, Traits> &stream, const Ptr<T> &ptr) { return stream << ptr.operator->(); // or ptr.get(), if you implement it }
你应该重载operator T*()
.
请注意,您存储的指针是指向参数的指针,一旦构造函数返回,它就会变得无效,因此在任何位置取消引用它会导致程序未定义。
你可能想要
Ptr(T* t) : p{t} { }
和
Ptr<int> y = &x;
相关文章:
- 空基优化子对象的地址
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 如何在C++中获取该对象的类声明中对象的地址?
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 已转换对象的地址
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- 为什么按值返回的对象与方法中的对象具有相同的地址?
- 这个指针指向给定的对象还是给定对象的地址
- 对象地址是否保证是其类型对齐的倍数
- C++多态性:有没有办法找到对象成员函数的地址?
- 如何在 c++ 中操作当前对象的地址?
- static_casting基对象的地址到派生类的指针
- 如果我有指向基类对象的指针,如何获取虚拟方法的地址?
- 更改保留指向其字段的原始指针的对象地址
- 在 std::map 中插入对象时构造函数中变量的地址
- C++:获取包含成员子对象的完整对象的地址