通过指针阻止调用成员函数

vso*_*tco 0 c++ pointers

考虑一下代码:

#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为私有不是一种选择.

Bau*_*gen 7

你不能,因为你不能改变内置类型的语义.

operator ->operator*会一直为内置的工作Foo*.然后,由于它是简写(*pFoo).f(),您有一个可以调用Foo公共的有效对象f().