通过提供"proxy"指针隐藏原始指针
Hiding raw pointers by providing a "proxy" pointer
是否有一种方法可以将原始指针隐藏在"代理"或"假"指针后面,从而提供对原始指针功能的访问而不显示其地址?
原始指针的管理类如下所示:
template<typename T>
class hidden_ptr
{
public:
hidden_ptr(T *RawPointer);
~hidden_ptr();
T *get()
{
return new proxy_pointer<T>(raw_pointer)
}
};
然后使用:
class Foo
{
public:
Foo();
~Foo();
void do_bar();
void do_bar2();
};
int main()
{
Foo *raw_pointer = new Foo();
hidden_ptr<Foo> hidden(raw_pointer);
Foo *proxy = hidden.get();
proxy->do_bar();
proxy->do_bar2();
delete proxy; //The raw pointer is still safe till the hidden object destructs
}
如果有一种方法,proxy_ptr会是什么样子?
满足目前为止提供的需求组合的唯一方法是使类Foo
成为各种双模式类:它应该能够充当主(隐藏)对象,以及自身的公共代理,即另一个Foo
对象。
一个相当"丑陋"的实现可能如下所示
class Foo
{
Foo *redirect_to = nullptr;
Foo(Foo *redirect_to) : redirect_to(redirect_to) { ... }
public:
Foo() { ... }
~Foo() { ... }
Foo *get_proxy() { return new(this); }
void do_bar() {
if (redirect_to) {
return redirect_to->do_bar();
...
}
void do_bar2() {
if (redirect_to) {
return redirect_to->do_bar2();
...
}
...
};
之后,您将能够创建和删除代理访问通过Foo *
指针。是否将这些代理包装成任何类型的智能指针取决于您—这不是重点。
int main()
{
Foo *raw_pointer = new Foo();
Foo *proxy = raw_pointer->get_proxy();
proxy->do_bar();
proxy->do_bar2();
delete proxy;
}
同样,如果您愿意,您可以将hidden_ptr
添加到混合物中。
有两个:std::unique_ptr
和std::shared_ptr
。尽管它们背后的一般意图更多地是为了提供简单的资源管理,但它们满足了您的请求。
是。这很简单。只需将指针成员设置为私有,然后重载*和->操作符来解引用该私有成员。但这也是一件毫无意义的事情,一个"中国盒子"编程的极端情况,你创建的"抽象"实际上只是其他数据类型的别名或包装。
你可以这样做:
#include <iostream>
template<typename T>
class hidden_ptr
{
public:
hidden_ptr() = delete;
hidden_ptr(hidden_ptr const&) = delete;
hidden_ptr(T data) : ptr_(new T{data}) {}
void operator=(hidden_ptr const&) = delete;
~hidden_ptr() {delete ptr_;}
T* operator->() {return ptr_;};
void reset(T data) {this->~hidden_ptr(); ptr_ = new T{data};}
void set(T value) {*ptr_ = value;}
T get() {return *ptr_;}
private:
T* ptr_;
};
class A
{
public:
void print() {std::cout << "A::print" << std::endl;}
};
int main()
{
hidden_ptr<int> ptr_int(5);
hidden_ptr<A> ptr_a(A{});
ptr_int.reset(10);
std::cout << ptr_int.get() << std::endl;
ptr_a->print();
}
这样用户不能访问指针地址。这是你想要的吗?
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- 结构和双指针隐藏在其他结构中,多层混淆
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 如何在启动时在Qt应用程序中隐藏鼠标指针
- 使用指针(PIMPL IDIOM)隐藏实现
- 如何在启动时隐藏鼠标指针
- 更改方法以添加隐藏的this指针是否会破坏二进制兼容性
- 通过内部指针隐藏实现详细信息
- 通过提供"proxy"指针隐藏原始指针
- 隐藏带有引用的指针
- C++这个指针,在函数调用中隐藏参数