Может ли переменная вызывать частную функцию? - PullRequest
0 голосов
/ 30 ноября 2011

Допустим, вам дана следующая диаграмма классов UML:

Mystery UML Class Diagram

Может ли переменная типа Mystery вызвать функцию DoSomething()?

Iпонимать, что объект (скажем, Mystery X;) может вызвать GetA() для доступа к закрытой переменной int a и для доступа к публичной переменной int b, все что вам нужно - это X.b, но как этот объект, X, может получитьприватная функция DoSomething(), если это вообще возможно?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Мне было трудно понять, что именно вы спрашиваете, но, думаю, я понял это.

Если вы спрашиваете, если дано следующее объявление:

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

Вы можете сделать что-то вроде этого:

Mystery m;
m.DoSomething();

... тогда ответ - нет. Вы не можете вызывать private функции-члены (или ссылаться на private переменные-члены) вне контекста класса. Только другая функция-член Mystery может вызывать private s. Например:

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

EDIT:

Вы не только не можете вызывать private участников из-за пределов класса, вы также не можете вызывать их из подклассов. Например, это недопустимо:

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

class Child : public Base
{
public:
    void Bar() 
    { 
        Foo();  // ERROR:  Can't call private method of base class
    }
};
1 голос
/ 01 декабря 2011

Существует один (отредактируйте - для полноты, их больше одного, см. Комментарии) - странный способ вызова закрытой функции-члена вне вашего класса, но для этого нужен небольшой надуманный пример, где выможет вернуть указатель на эту функцию:

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

При этом не делают это.Частные методы являются частными по определенной причине - они воплощают скрытые аспекты дизайна и никогда не предназначались для того, чтобы быть частью открытого интерфейса.Это означает, что они могут быть подвержены изменению поведения или даже полному удалению.Кроме того, выполнение такого рода махинаций может привести к тому, что код будет сильно и неловко связан, что нежелательно.

ЧТ Сказав, я действительно использовал это, и он работает довольно хорошо, хотяэто было в совершенно другом контексте, где это помогло уменьшить связь (это было в высокомодульной схеме регистрации событий, если вам интересно).

0 голосов
/ 30 ноября 2011

Любой метод внутри класса имеет доступ к закрытым переменным и методам. Он работает точно так же, как и при вызове любого другого метода, просто компилятор выдаст вам ошибку, если вы попытаетесь сделать это извне класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...