2009-12-13 12 views
23

No estoy seguro de cómo tener una función que recibe un objeto de clase como un parámetro. ¿Alguna ayuda? Aquí hay un ejemplo a continuación.Cómo utilizar un objeto de clase en C++ como un parámetro de función

#include<iostream> 

void function(class object); //prototype 

void function(class tempObject) 
{ 
    //do something with object 
    //use or change member variables 
} 

Básicamente estoy confundido acerca de cómo crear una función que va a recibir un objeto de clase como sus parámetros, y luego usar esos parámetros dentro de la función, como tempObject.variable.

Lo siento si esto es un poco confuso, yo soy relativamente nuevo en C++.

+0

@Adrian Por favor, no invente nuevas etiquetas, hay demasiadas. –

Respuesta

29

class es una palabra clave que se utiliza solamente * para introducir las definiciones de clase. Cuando declara nuevas instancias de clases, ya sea como objetos locales o como parámetros de funciones, solo utiliza el nombre de la clase (que debe estar dentro del alcance) y no la palabra clave class.

p. Ej.

class ANewType 
{ 
    // ... details 
}; 

Esto define un nuevo tipo llamado ANewType que es un tipo de clase.

entonces usted puede utilizar esto en la declaración de funciones:

void function(ANewType object); 

entonces puede pasar objetos de tipo ANewType en la función. El objeto se copió en el parámetro de la función de modo, al igual que los tipos básicos, cualquier intento de modificar el parámetro modificará sólo el parámetro de la función y no afectará el objeto que fue aprobada originalmente en.

Si Si desea modificar el objeto fuera de la función como lo indican los comentarios en su cuerpo de función, debería tomar el objeto por referencia (o puntero). P.ej.

void function(ANewType& object); // object passed by reference 

Esta sintaxis significa que cualquier uso de object en el cuerpo de la función se refiere al objeto real que fue aprobada en la función y no una copia. Todas las modificaciones modificarán este objeto y serán visibles una vez que la función se haya completado.

[* La palabra clave class también se utiliza en las definiciones de plantilla, pero eso es un tema diferente.]

+3

No es que la palabra clave class sea ilegal, ya que él la usa. La siguiente es una TU perfectamente válida: 'void f (clase foo);'. Si aún no se conoce a "foo", se introducirá allí, por lo que es una declaración directa en un lugar poco común. –

+1

@litb: 100% correcto, pero probablemente sea más confuso que útil para un principiante. He tenido algo de experiencia con C++, pero estaría haciendo una doble o triple si encuentro 'void f (clase foo);' en la naturaleza. –

+0

Perfecto, gracias por la explicación extendida. ¡Muy apreciado! – James

8

En su forma más simple:

#include <iostream> 
using namespace std; 

class A { 
    public: 
    A(int x) : n(x){} 
    void print() { cout << n << endl; } 
    private: 
    int n; 
}; 

void func(A p) { 
    p.print(); 
} 

int main() { 
    A a; 
    func (a); 
} 

Por supuesto, es probable que debe utilizar referencias a pasar el objeto, pero sospecha que no ha llegado a ellos todavía.

+2

Pase por ref es una peculiaridad necesaria de C++ que * necesita * introducirse por adelantado, incluso si el usuario aún no lo comprende. En particular, el OP quería * modificar * los miembros de la clase. –

+1

Si no entiende cómo hacer una llamada a función simple, creo que introducir referencias es una mala idea. Y si quiere cambiar los contenidos de la clase, también necesita entender lo privado y lo público y lo constness. –

+0

Tiene que pasar algún valor cuando crea un objeto como en A a (4); en la línea número 3 desde abajo, por ejemplo. –

5

Si desea pasar de clase casos (objetos), use bien

void function(const MyClass& object){ 
    // do something with object 
} 

o

void process(MyClass& object_to_be_changed){ 
    // change member variables 
} 

Por otro lado, si usted quiere "pasar" la clase

template<class AnyClass> 
void function_taking_class(){ 
    // use static functions of AnyClass 
    AnyClass::count_instances(); 
    // or create an object of AnyClass and use it 
    AnyClass object; 
    object.member = value; 
} 
// call it as 
function_taking_class<MyClass>(); 
// or 
function_taking_class<MyStruct>(); 

con

class MyClass{ 
    int member; 
    //... 
}; 
MyClass object1; 
+0

Una excelente distinción en const, allí. –

-1

errores sagrados La razón para el código de abajo es mostrar cómo no nula principal cada función y no al tipo de retorno; para las funciones ...... en lugar de eso empuje todo en el sedimento para el cual está el prototipo de la función de impresión ... si necesita usar funciones útiles ... tendrá que hacer lo siguiente ..... (ps esto a continuación es que la gente abrumados por estas plantillas de objetos y T que permiten diferentes tipos de declaración de variables (como flotador y carbón) para utilizar el mismo pasa por valor en una función definida por el usuario)

char arr[ ] = "This is a test"; 

string str(arr); 


// You can also assign directly to a string. 
str = "This is another string"; 

puede alguien decirme por qué C++ hizo que las matrices pasaran de uno en uno y la única forma de eliminar espacios y signos de puntuación es mediante el uso de tokens de cadenas. No pude evitar el problema cuando estaba tratando de eliminar espacios para un palíndromo ...

#include <iostream> 
#include <iomanip> 
using namespace std; 
int getgrades(float[]); 
int getaverage(float[], float); 
int calculateletters(float[], float, float, float[]); 
int printResults(float[], float, float, float[]); 


int main() 
{ 

int i; 
float maxSize=3, size; 
float lettergrades[5], numericgrades[100], average; 

size=getgrades(numericgrades); 
average = getaverage(numericgrades, size); 
printResults(numericgrades, size, average, lettergrades); 
return 0; 
} 

int getgrades(float a[]) 
{ 


int i, max=3; 

for (i = 0; i <max; i++) 
{ 
    //ask use for input 
    cout << "\nPlease Enter grade " << i+1 << " : "; 
    cin >> a[i]; 
    //makes sure that user enters a vlue between 0 and 100 

    if(a[i] < 0 || a[i] >100) 
    { 
     cout << "Wrong input. Please 
enter a value between 0 and 100 only." << endl; 
     cout << "\nPlease Reenter grade " << i+1 << " : "; 
     cin >> a[i]; 

     return i; 
    } 
} 
} 

int getaverage(float a[], float n) 
{ 
int i; 
float sum = 0; 
if (n == 0) 
return 0; 
for (i = 0; i < n; i++) 
sum += a[i]; 
return sum/n; 
}        


int printResults(float a[], float n, float average, float letters[]) 
{ 
int i; 
cout << "Index Number | input | 
array values address in memory " << endl; 

for (i = 0; i < 3; i++) 
{ 
cout <<"  "<< i<<" \t\t"<<setprecision(3)<< 
a[i]<<"\t\t" << &a[i] << endl; 
} 
cout<<"The average of your grades is: "<<setprecision(3)<<average<<endl; 

} 
+0

¡Bienvenido a Stack Overflow! Aunque este código puede ayudar a resolver el problema, no explica "por qué" y/o "cómo" responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor educativo a largo plazo. Por favor [edite] su respuesta para agregar una explicación, incluyendo qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas