Вызов метода нестатического члена из другого метода - PullRequest
8 голосов
/ 15 марта 2012

Есть ли способ вызвать нестатический метод члена класса из другого метода, который содержится в главном классе в c ++? Если так, то как бы выглядел код?

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

Я пытаюсь использовать:

MyClass::myClassMethod();

из метода в главном классе, но он выдает ошибку: нестатическая ссылка на член должна относиться к определенному объекту.

Для пояснения, myClassMethod () использует другие методы в MyClass, такие как:

void myClassMethod() {
    ...
    anotherClassMethod();
}

поэтому, если бы я сделал myClassMethod статическим, это помешало бы вызову anotherClassMethod ().

Ответы [ 4 ]

4 голосов
/ 15 марта 2012

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

Если вы anotherClassMethod() не статичны, это означает, что он должен вызываться для определенного объекта, экземпляра класса. Поскольку он вызывается для объекта, он может получить доступ к данным, хранящимся в этом объекте (нестатические переменные-члены). Если myClassMethod() является статическим, и вы реализуете его как

void MyClass::myClassMethod() {
  anotherClassMethod();
}

Это не сработает, потому что anotherClassMethod() ожидает вызова для определенного объекта, но myClassMethod() не имеет такового. Но если вы знаете, к какому объекту вы хотите его вызвать, вы можете сделать это как обычный вызов метода для объекта:

void MyClass::myClassMethod(MyClass &object) {
  object.anotherClassMethod();
}

object не нужно передавать в качестве аргумента; это может быть статическая переменная-член в классе, например:

class MyClass {
private:
  static MyClass theInstance;

  // ...
};

void MyClass::myClassMethod() {
  theInstance.anotherClassMethod();
}

В конечном счете, вопрос, который вам нужно задать себе: почему myClassMethod() статичен, а почему anotherClassMethod() нестатичен? Сделай шаг назад, подумай о том, что myClassMethod() должен делать. Имеет ли смысл вызывать его, когда у вас нет экземпляра для работы? Если да, то почему он должен вызывать метод, который ожидает работать с экземпляром?

4 голосов
/ 15 марта 2012

Как обстоят дела с вызовом нестатической функции-члена из static функции-члена?

Каждой нестатической функции-члену неявно передается указатель this, в дополнение к передаваемым параметрам, переданный указатель затем разыменовывается для ссылки на члены объекта класса. Однако static функции не передаются с неявным указателем this и, следовательно, нельзя вызывать любую нестатическую функцию-член внутри статической функции-члена, потому что для этого нет this.

Какое решение, если вы все равно хотите это сделать?

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

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


По второму размышлению, может быть, я неправильно прочитал ваш Вопрос раньше, Возможно, Ваш вопрос:

Как вызвать нестатическую функцию-член класса из main?

Вам нужен экземпляр класса для вызова нестатических функций-членов.
Так просто,

MyClass obj; 
obj.myClassMethod();   

И вызов любой другой функции-члена из myClassMethod() будет просто:

void myClassMethod()
{
   //...
   anyOtherMyClassNonStaticMemberFunction(); 
   //...
}
3 голосов
/ 15 марта 2012

Единственный способ вызвать нестатический метод класса - через экземпляр этого класса.Так что вам нужно что-то вроде этого ...

MyClass myClass;
myClass.myClassMethod();
0 голосов
/ 15 марта 2012

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

...