考虑代码:
#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;
}
有没有办法阻止编译下一行到最后一行pFoo -> f();
?换句话说,我希望能够创建一个指向该对象的指针,但不能在调用成员函数时使用它。删除operator*()
和operator->()
不起作用,因为它们仅由Foo
调用,而不是由指向Foo
的指针调用。
PS:我希望能够在堆上创建对象,因此将operator new
标记为私有不是一种选择。
答案 0 :(得分:7)
你不能,因为你不能改变内置类型的语义。
operator ->
和operator*
将始终适用于内置Foo*
。然后,由于它是(*pFoo).f()
的简写,因此您有一个有效的Foo
对象,可以在其上调用公共f()
。
答案 1 :(得分:0)
如何创建一个const指针const Foo* pFoo = new Foo;
并且你不能使用该类的非const方法。