literatura funcion fisica estatica ejemplos c++ class methods static-methods

c++ - ejemplos - funcion estatica en fisica



Llamar a un método miembro no estático desde otro método (4)

¿Hay alguna manera de llamar a un método de miembro de clase no estático desde otro método que está contenido dentro de la clase principal en c ++? Si es así, ¿cómo se vería el código?

El problema es que no puedo declarar este método específico como estático, porque usa otros métodos dentro de la misma clase que luego no funcionan si lo hago estático.

Estoy tratando de usar:

MyClass::myClassMethod();

de un método dentro de la clase principal, pero me da el error: una referencia de miembro no estática debe ser relativa a un objeto específico.

Para aclarar, myClassMethod () usa otros métodos dentro de MyClass como:

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

así que si tuviera que hacer myClassMethod estático interferiría con llamar a otro Método de clase ().


Creo que tal vez podrías usar el patrón singleton, mantener una instancia de la clase en global. como una clase de utilidad.


La única forma de llamar a un método no estático de una clase es a través de una instancia de esa clase. Entonces necesitarías algo como esto ...

MyClass myClass; myClass.myClassMethod();


Un método estático es aquel que no se ejecuta en ningún objeto en particular. Es muy parecido a una función independiente fuera de una clase, excepto que tiene permitido acceder a miembros privados de su clase.

Si anotherClassMethod() no es estático, eso significa que debe anotherClassMethod() en un objeto específico, una instancia de la clase. Como se llama a un objeto, puede acceder a los datos almacenados en ese objeto (variables de miembro no estáticas). Si myClassMethod() es estático y lo implementa como

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

Eso no funcionará porque anotherClassMethod() espera ser llamado en un objeto específico, pero myClassMethod() no tiene uno. Pero si sabe a qué objeto desea llamar, puede hacerlo como una llamada a un método ordinario en un objeto:

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

El object no tiene que pasar como un argumento; podría ser una variable miembro estática en la clase, por ejemplo:

class MyClass { private: static MyClass theInstance; // ... }; void MyClass::myClassMethod() { theInstance.anotherClassMethod(); }

En última instancia, la pregunta que debe myClassMethod() es: ¿por qué myClassMethod() estática y por qué es anotherClassMethod() no estático? myClassMethod() un paso atrás, piense en lo que se myClassMethod() que myClassMethod() debe hacer. ¿Tiene sentido llamarlo cuando no tienes una instancia para trabajar? Si es así, ¿por qué necesita llamar a un método que espera trabajar con una instancia?


¿Cuál es el problema con llamar a la función de miembro no estático desde una función miembro static ?

Cada función miembro no estática se pasa implícitamente a this puntero además de los parámetros que pasa, el puntero pasado se desreferencia para referir miembros de objetos de clase. Sin embargo, las funciones static no se pasan con el puntero implícito y por lo tanto no se puede llamar a ningún miembro no estático función dentro de una función miembro estática porque no hay this para hacerlo.

¿Cuál es la solución, si quieres hacerlo de todos modos?

Necesitará algún mecanismo para obtener el puntero al objeto dentro del método estático y luego puede llamar a la función miembro usando ese puntero.
¿Como hacer eso?
Deberá almacenar el puntero al objeto de clase globalmente, o pasarlo como una instancia en uno de los argumentos de función al método estático.

Sin embargo, ambos de los anteriores son soluciones temporales, lo importante a tener en cuenta aquí es Si siente la necesidad de llamar a una función de miembro no estático a través de una función de miembro estático, entonces hay algo mal en su diseño.

En segundo lugar, quizás leí mal su pregunta antes, probablemente, su pregunta es:

¿Cómo llamar a una función miembro no estática de una clase desde main ?

Necesita una instancia de la clase para llamar a funciones miembro no estáticas.
Tan simplemente,

MyClass obj; obj.myClassMethod();

Y llamar a cualquier otra función miembro desde myClassMethod() sería simplemente:

void myClassMethod() { //... anyOtherMyClassNonStaticMemberFunction(); //... }