0

假设您有以下 UML 类图:

神秘的UML类图

类型的变量可以Mystery调用函数DoSomething()吗?

我知道一个对象(比如说Mystery X;)可以调用GetA()来访问私有变量int a 并访问int b您所需要的公共变量,X.b 但是如果可能的话,这个对象如何X访问私有函数DoSomething() 呢?

4

3 回答 3

3

我很难理解你在问什么,但我想我已经弄清楚了。

如果您要问是否,请给出以下声明:

class Mystery
{
/*...*/
private:
  void DoSomething();
};

你可以这样做:

Mystery m;
m.DoSomething();

……那么答案是否定的。您不能从类的上下文之外调用private成员函数(或引用成员变量)。private只有另一个成员函数Mystery可以调用privates。例如:

void Mystery::Foo()
{
  DoSomething();  // this would be possible if Foo() is a member of Mystery
}

编辑:

不仅不能调用private类外的成员,也不能调用子类的成员。例如,这是无效的:

class Base
{
private:
    void Foo() {};
};

class Child : public Base
{
public:
    void Bar() 
    { 
        Foo();  // ERROR:  Can't call private method of base class
    }
};
于 2011-11-30T20:00:07.393 回答
1

有一个(编辑-为了完整起见,不止一个,请参阅评论)可以在您的类之外调用私有成员函数的奇怪方式,但它需要一些人为的示例,您可以在其中返回一个指向此函数的指针:

class Mystery;
typedef void (Mystery::*fptr)();

class Mystery{
    void DoSomething() {};
public:
    static fptr GetPrivateDoSomething()
    {
        return &DoSomething;
    }
};

int main(int argc, char *argv[])
{
    Mystery m;
    fptr ds = Mystery::GetPrivateDoSomething();
    (m.*ds)();
    return 0;
}

话虽如此,要这样做。私有方法之所以是私有的,是有原因的——它们体现了设计的隐藏方面,并且从未打算成为公开接口的一部分。这意味着他们可能会改变行为,甚至完全删除。此外,做这些恶作剧会导致代码高度耦合和尴尬,这是不可取的。

虽这么说,我确实使用过它并且效果很好,尽管它是在一个完全不同的环境中帮助减少耦合(如果你想知道的话,它是在一个高度模块化的事件注册方案中)。

于 2011-11-30T20:10:16.940 回答
0

类中的任何方法都可以访问私有变量和方法。它的工作方式与调用任何其他方法完全一样,只是如果您尝试从类外部执行此操作,编译器会给您一个错误。

于 2011-11-30T19:50:36.890 回答