4

我想创建一个非静态方法,只有类(或其子类之一)的同一实例的构造函数才能调用。除了面向密钥的访问保护模式之外,是否有一种优雅的方法可以做到这一点?

class MyClass
{
   public:
     void foo()
     {
        assert(foo was called from the constructor); //how?!
        if (some condition or other)
            throw ExceptionThatOnlyClientsThatConstructTheObjectCanHandle();  //hence my requirement
     }
};

class MySubClass : public MyClass
{
  public:
     MySubClass() 
     { 
       blah(); //correct use of foo() through blah()
       foo(); //correct use of foo() directly
     } 
     void blah() { foo(); } //correctness depends on who called blah()
};

int main()
{
   MySubClass m;
   m.foo(); // incorrect use of foo()
   m.blah(); // incorrect use of foo() through blah()
   return 0;
}

编辑:请参阅下面的评论,但我认为这是(1)面向传递键的访问控制或(2)确保处理异常的特殊情况。这么看,constructor 的事情就是一个红鲱鱼。

4

1 回答 1

5

不,如果没有其他变量告诉您​​,这是不可能的。您能做的最好的事情是制作方法private,以便只有您的类可以调用它。然后确保只有构造函数调用它。除此之外,您只希望构造函数调用它,您是否尝试过不使用函数而只是将代码放在那里

于 2013-07-25T16:54:01.410 回答