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

时间:2015-01-13 17:18:14

标签: 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;
}

有没有办法阻止编译下一行到最后一行pFoo -> f();?换句话说,我希望能够创建一个指向该对象的指针,但不能在调用成员函数时使用它。删除operator*()operator->()不起作用,因为它们仅由Foo调用,而不是由指向Foo的指针调用。

PS:我希望能够在堆上创建对象,因此将operator new标记为私有不是一种选择。

2 个答案:

答案 0 :(得分:7)

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

operator ->operator*将始终适用于内置Foo*。然后,由于它是(*pFoo).f()的简写,因此您有一个有效的Foo对象,可以在其上调用公共f()

答案 1 :(得分:0)

如何创建一个const指针const Foo* pFoo = new Foo;并且你不能使用该类的非const方法。