变量可以调用私有函数吗?

时间:2011-11-30 19:46:46

标签: c++ class variables private-functions

假设您获得以下UML类图:

Mystery UML Class Diagram

Mystery类型的变量是否可以调用函数DoSomething()

我了解对象(例如Mystery X;)可以调用GetA()来访问私有变量int a 并且只需int b即可访问公共变量X.b 但是这个对象X如何访问私有函数DoSomething() 如果它甚至可能吗?

3 个答案:

答案 0 :(得分:3)

我很难理解你的要求,但我想我已经明白了。

如果你问是否给出以下声明:

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

你可以这样做:

Mystery m;
m.DoSomething();

...然后答案是否定的。您不能从类的上下文之外调用private成员函数(或引用private成员变量)。只有Mystery的其他成员函数才能调用private。例如:

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
    }
};

答案 1 :(得分: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;
}

话虽如此,这样做。私有方法是私有的,因为它们体现了设计的隐藏方面,并且从未打算成为暴露界面的一部分。这意味着他们可能会受到行为改变,甚至完全删除。另外,做这些类型的恶作剧会导致代码高度笨拙地耦合,这是不可取的。

那是,我确实使用了它并且它运行得很好,尽管它处于一个完全不同的环境中,它有助于减少耦合(它在一个高度模块化的事件注册方案,如果你想知道的话。)

答案 2 :(得分:0)

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