2012-05-04 97 views
16

¿Es posible invocar un método de clase c++ sin crear primero una instancia de clase?¿Invocar un método de clase C++ sin una instancia de clase?

Supongamos que tenemos el siguiente código:

// just an example 
#include <iostream> 
using namespace std; 

class MyClass { 
    public: 
     MyClass(); 
     ~MyClass(); 
     int MyMethod(int *a, int *b); 
}; 

// just a dummy method 
int MyClass::MyMethod(int *a, int *b){; 
    return a[0] - b[0]; 
} 

He aquí otro ejemplo:

#include <iostream> 
using namespace std; 

class MyClassAnother { 
    public: 
     MyClassAnother(); 
     ~MyClassAnother(); 
     int MyMethod(int *a, int *b); 
}; 

// just a dummy method 
int MyClassAnother::MyMethod(int *a, int *b){; 
    return a[0] + b[0]; 
} 

Como podemos ver, en los ejemplos anteriores, ambas clases no tienen variables internas y usar constructores/destructores ficticios; Su único propósito es exponer un método público, MyMethod(..). Aquí está mi pregunta: supongamos que hay 100 clases en el archivo (todas con diferentes nombres de clase, pero con una estructura idéntica, un método público con el mismo prototipo) MyMethod(..).

¿Hay alguna manera de invocar el MyMethod(..) llamadas a métodos de cada una de las clases sin crear primero una instancia de clase para cada

+1

¿Qué tal hacer 'MyMethod' estático? http://www.functionx.com/cppcli/classes/Lesson12b.htm – rjz

+1

¿Y realmente necesita el constructor/destructor? Oye, ¿por qué no utilizar una función gratuita en primer lugar? – Keith

+0

@Keith - No necesito el constructor/destructor. Pero, sí necesito tener todos los métodos llamados 'MyFunction()' - entonces, para diferenciar entre los diferentes métodos, los estoy envolviendo en diferentes clases; ¿Tiene una mejor idea de cómo lograr esa funcionalidad sin dejar de llamarlos 'MyFunction()'? – user58925

Respuesta

23

Usar la palabra clave 'estático' para declarar el método:?

static int MyMethod(int * a, int * b); 

a continuación, se puede llamar al método sin una instancia como tal :

int one = 1; 
int two = 2; 

MyClass::MyMethod(&two, &one); 

Los métodos "estáticos" son funciones que solo utilizan la clase como espacio de nombres y no requieren una instancia.

+0

Pasa 'int's a una función que toma' int * 's. –

+0

@ Robᵩ Gracias por señalarlo, lo he cambiado para usar punteros :) – Greyson

+0

@Greyson - ¡gracias! Entonces, básicamente, yendo por la ruta 'estática', podré definir cientos de clases +' métodos MyMethod() 'e invocarlos sin instancias de clases, ¿verdad? MyClass1 :: MyMethod (& two, &one); MyClass2 :: MyMethod (& two, &one); ............... MyClass3 :: MyMethod (& two, &one); ¿Lo entendí bien? – user58925

3

Puede llamar a un método de clase sin una instancia al declararlo static, pero eso no parece ser lo que desea. Desea poder llamar al mismo método en 100 clases diferentes.

Existen dos maneras para que C++ diferencie entre diferentes métodos de clase. Una es hacerlo en tiempo de compilación, y otra es hacerlo en tiempo de ejecución. En tiempo de compilación, necesita invocar el nombre de la clase como parte de la llamada en un método estático, o necesita que la instancia del objeto o el puntero sea para una clase derivada específica. En tiempo de ejecución puede llamar a un método polimórficamente si ha declarado el método virtual. Tenga en cuenta que necesita un objeto de la clase para usar cualquiera de los métodos de tiempo de ejecución.

+0

sí, quiero llamar al mismo * nombre del método * - 'MyMethod()'. Sin embargo, cada clase tendrá una implementación diferente para 'MyMethod()'. Lo declarará * static * me ayudará a llamar a los diversos métodos 'MyMethod()', mientras invoco cada vez una clase/implementación diferente? – user58925

+0

@ user58925, no, declararlo 'static' hará que sea imposible usar el método polimórficamente. Necesitas declararlo' virtual', pero también debes llamarlo desde una instancia de la clase. No hay forma de evitarlo. –

+0

No soy Seguro que me estoy aclarando adecuadamente. Básicamente, idealmente me gustaría definir los métodos 'MyMethod()' como * funciones gratuitas * (sin clases); Sin embargo, esto me obligará a darle a cada una de esas funciones un nombre diferente, y por lo tanto, para simplificar el proceso, tiene sentido para mí usar simplemente el mismo nombre ('MyFunction') mientras envuelve cada uno de estos en un clase única; ¿Cómo va 'virtual' a ayudar en el caso ilustrado arriba? ¡Gracias! – user58925

1

Como mencionan Mark Random y Greyson, puede hacer que el método sea estático y luego invocar la firma correcta sin instanciar un objeto. Sin embargo, es posible que desee pensar dos veces antes de escribir su función de esta manera en lugar de escribir una versión diferente de la misma función. Estas son las consideraciones, especialmente para un programa grande:

  • métodos estáticos son difícil escribir pruebas unitarias para.
  • B/c de la naturaleza de los métodos estáticos, residen en la memoria todo el tiempo.
  • El subprocesamiento múltiple sería difícil si su programa necesita utilizarlo.
+0

gracias. La verdad es que tendré miles de tales clases en un archivo de utilidad, y necesitaré llamar a * todos * los métodos 'MyMethod (...)' en algún momento u otro; Realmente no quiero tener que crear una instancia cada vez antes de llamar a un 'MyMethod (...)' - por lo tanto, pensé que 'static' es el camino a seguir. ¿Tiene una mejor sugerencia/alternativa a esto? – user58925

+0

¿Alguna idea de cuánta memoria (aproximadamente) puede tomar cada 'MyMethod (...)'? ¿Será un problema de memoria si tengo miles de tales métodos en la memoria? – user58925

+0

¿Qué tiene de difícil escribir una prueba para un método estático? Es casi lo mismo que una función gratuita. Es difícil si supone que tiene que hacer una subclase para realizar la prueba, pero ese no es el enfoque correcto para un método que sí comparte la invariante del estado de la clase. – mabraham

Cuestiones relacionadas