2012-03-15 37 views
8

¿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?Llamar a un método miembro no estático desde otro método

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 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 estática miembro no debe ser relativa a un objeto específico.

Para aclarar, myClassMethod() utiliza otros métodos dentro de MiClase como:

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

así que si tuviera que hacer myClassMethod estática que pudiera interferir con llamar anotherClassMethod().

+0

Después de leer la pregunta y los comentarios en las respuestas ya publicadas, aún sería útil tener más información acerca de lo que está tratando de hacer. ¿Está 'myClassMethod' en sí mismo estático? ¿De dónde se está llamando? ¿Puedes cambiar los argumentos al método? ¿Cuál es el objetivo del problema que le han asignado? – tmpearce

+0

Parece que realmente necesita saber qué tipo de comportamiento puede desear aquí. La diferencia clave con los métodos estáticos y no estáticos es que este último necesita acceder a cualquier clase de datos, o tal vez hacer llamadas virtuales que internamente hacen más de lo mismo. Si 'myClassMethod' llama' anotherClassMethod' que no es estático, ¿necesita hacer esto? Si no, hágalos estáticos. Si es así, ¿qué espera que suceda cuando el método intente acceder a los datos? – Keith

Respuesta

3

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

Cada función miembro no estática se pasa un puntero this implícitamente además de los parámetros que Pass, el puntero pasado entonces se eliminan las referencias para referirse miembros de objeto de clase Sin embargo static funciones no se pasan con el this puntero implícito y por lo tanto no se puede llamar a cualquier función miembro no estática dentro de una función miembro estática porque no hay this para hacerlo.

¿Cuál es la solución, si desea 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 utilizando ese puntero.
¿Cómo 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, ambas soluciones son soluciones provisionales, lo importante a tener en cuenta es Si siente la necesidad de llamar a una función miembro no estática a través de una función de miembro estático, su diseño tiene algún problema.


En segundo lugar pensamientos tal vez yo mis-leer su pregunta antes, probablemente, su pregunta es:

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

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

MyClass obj; 
obj.myClassMethod(); 

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

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

Lo siento, soy un novato. ¿Cómo haría esto? – aclark

+0

@aclark: compruebe la respuesta actualizada, agregué más detalles. ¿Tiene sentido? –

+0

Gracias por la explicación. El problema es que el diseño lo da el instructor, así que tengo que trabajar con él. Me parece bastante intrincado: -/ – aclark

3

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

MyClass myClass; 
myClass.myClassMethod(); 
+0

Esto es genial. Gracias. – aclark

4

Un método estático es uno 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() es no estático, eso significa que debe llamarse a un objeto específico, una instancia de la clase. Debido a que se llama a un objeto, puede acceder a los datos almacenados en ese objeto (variables de miembro no estáticas). Si myClassMethod() es estática y que implementarlo como

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

Eso no funcionará porque anotherClassMethod() espera de ser llamado en un objeto específico, pero myClassMethod() no la tiene. Pero si usted sabe lo que se oponga al que desea llamar en, puede hacerlo como una llamada de método ordinario en un objeto:

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

El object no tiene que ser pasado como argumento; que 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 hay que preguntarse es: ¿por qué es myClassMethod() estática, y por qué es anotherClassMethod() no estático? Dé un paso atrás, piense en lo que se supone que debe hacer myClassMethod(). ¿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?

0

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

Cuestiones relacionadas