考虑一下代码:
#include <iostream>
class Foo
{
public:
Foo& operator*() = delete;
Foo* operator->() = delete;
void f()
{
std::cout << "Foo::f()" << std::endl;
}
};
int main()
{
Foo foo;
// foo -> f(); // invokes deleted operator ->, so it doesn't compile
Foo* pFoo = new Foo;
pFoo -> f(); // how can we make this not compilable?
delete pFoo;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法防止下一个最后一行pFoo -> f();编译?换句话说,我希望能够创建一个指向该对象的指针,但不能在调用成员函数时使用它.删除operator*()和operator->()不起作用,因为它们仅由Foo指针调用,而不是由指针调用Foo.
PS:我希望能够在堆上创建对象,因此标记operator new为私有不是一种选择.
你不能,因为你不能改变内置类型的语义.
operator ->并operator*会一直为内置的工作Foo*.然后,由于它是简写(*pFoo).f(),您有一个可以调用Foo公共的有效对象f().
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |