web-dev-qa-db-fra.com

Comment utiliser un objet de classe en C++ en tant que paramètre de fonction

Je ne suis pas sûr de savoir comment avoir une fonction qui reçoit un objet de classe en tant que paramètre. De l'aide? Voici un exemple ci-dessous.

#include<iostream>

void function(class object); //prototype

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

En gros, je ne comprends pas comment créer une fonction qui recevra un objet de classe en tant que paramètres, puis utiliser ces paramètres dans la fonction, tels que tempObject.variable.

Désolé si cela est un peu déroutant, je suis relativement nouveau en C++.

26
James

class est un mot clé utilisé uniquement * pour introduire les définitions de classe. Lorsque vous déclarez de nouvelles instances de classe en tant qu'objets locaux ou en tant que paramètres de fonction, vous utilisez uniquement le nom de la classe (qui doit figurer dans la portée) et non le mot clé class.

par exemple.

class ANewType
{
    // ... details
};

Ceci définit un nouveau type appelé ANewType qui est un type de classe.

Vous pouvez ensuite utiliser ceci dans les déclarations de fonction:

void function(ANewType object);

Vous pouvez ensuite passer des objets de type ANewType dans la fonction. L'objet sera copié dans le paramètre de fonction. Ainsi, à l'instar des types de base, toute tentative de modification du paramètre ne modifiera que le paramètre de la fonction et n'affectera pas l'objet transmis à l'origine.

Si vous souhaitez modifier l'objet en dehors de la fonction comme indiqué par les commentaires dans votre corps de fonction, vous devez le prendre par référence (ou pointeur). Par exemple.

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

Cette syntaxe signifie que toute utilisation de object dans le corps de la fonction fait référence à l'objet réel qui a été transmis à la fonction et non à une copie. Toutes les modifications modifieront cet objet et seront visibles une fois la fonction terminée.

[* Le mot clé class est également utilisé dans les définitions de modèle, mais le sujet est différent.]

33
CB Bailey

Au plus 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 );
}

Bien sûr, vous devriez probablement utiliser des références pour transmettre l'objet, mais je suppose que vous ne les avez pas encore.

10
anon

Si vous voulez passer classe instances (objets), vous utilisez soit

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

ou

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

Par contre si vous voulez "passer" la classe elle-même

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>();

avec 

class MyClass{
  int member;
  //...
};
MyClass object1;
5
Barnabas Szabolcs

Je demandais la même chose aussi. Une autre solution est de surcharger votre méthode:

void remove_id(EmployeeClass);
void remove_id(ProductClass);
void remove_id(DepartmentClass);

dans l'appel, l'argument s'adapte en conséquence à l'objet que vous passez. mais alors vous devrez vous répéter

void remove_id(EmployeeClass _obj) {
    int saveId = _obj->id;
    ...
};

void remove_id(ProductClass _obj) {
    int saveId = _obj->id;
    ...
};

void remove_id(DepartmentClass _obj) {
    int saveId = _obj->id;
    ...
};
0
vincent thorpe