Jak używać obiektu klasy w C++ jako parametru funkcji

Nie jestem pewien, jak mieć funkcję, która odbiera obiekt klasy jako parametr. Jakaś pomoc? Oto przykład poniżej.

#include<iostream>

void function(class object); //prototype

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

Zasadniczo jestem po prostu zdezorientowany, jak utworzyć funkcję, która otrzyma obiekt klasy jako swoje parametry, a następnie użyć tych parametrów wewnątrz funkcji, takich jak tempObject.variable.

Przepraszam, jeśli to trochę mylące, jestem stosunkowo nowy w C++.

Author: James, 2009-12-13

4 answers

class jest słowem kluczowym, które jest używane tylko* do wprowadzenia definicji klas. Kiedy deklarujesz nowe instancje klas jako obiekty lokalne lub jako parametry funkcji, używasz tylko nazwy klasy (która musi znajdować się w zakresie), a nie samego słowa kluczowego class.

Np.

class ANewType
{
    // ... details
};

Definiuje nowy typ o nazwie ANewType, który jest typem klasy.

Możesz użyć tego w deklaracjach funkcji:

void function(ANewType object);

Można następnie przekazać obiekty typu ANewType do funkcji. Na obiekt zostanie skopiowany do parametru funkcji, tak więc, podobnie jak typy podstawowe, każda próba modyfikacji parametru zmieni tylko parametr w funkcji i nie wpłynie na obiekt, który został pierwotnie przekazany.

Jeśli chcesz zmodyfikować obiekt poza funkcją, jak wskazują komentarze w ciele funkcji, musisz wziąć obiekt przez odniesienie (lub wskaźnik). Np.

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

Składnia ta oznacza, że każde użycie object w ciele funkcji odnosi się do rzeczywistego obiektu, który został przekazany do funkcji, a nie do kopii. Wszystkie modyfikacje zmodyfikują ten obiekt i będą widoczne po zakończeniu funkcji.

[*słowo kluczowe class jest również używane w definicjach szablonów, ale to inny temat.]

 32
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-13 12:43:48

W najprostszym:

#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 );
}

Oczywiście, prawdopodobnie powinieneś używać referencji, aby przekazać obiekt, ale podejrzewam, że jeszcze do nich nie dotarłeś.

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-13 12:45:17

Jeśli chcesz przekazać instancje klasy (objects), możesz użyć

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

Lub

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

Z drugiej strony, jeśli chcesz "zdać" klasę samą

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

Z

class MyClass{
  int member;
  //...
};
MyClass object1;
 5
Author: Barnabas Szabolcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 20:25:46

Holy errors powodem poniższego kodu jest pokazanie, jak nie unieważnić każdej funkcji main i nie wpisywać return; for functions...... zamiast tego wcisnąć wszystko do osadu, dla którego jest prototyp funkcji drukowania... jeśli potrzebujesz użyć przydatnych funkcji ... będziesz musiał poniżej..... (p. s.to poniżej jest dla osób przytłoczonych tymi szablonami object i T, które pozwalają różnym typom deklaracji zmiennych (takim jak float i char) używać tej samej wartości przekazywanej przez użytkownika function)

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

string str(arr);


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

Czy ktos moze mi powiedziec dlaczego c++ zrobil tablice w wartosci pass by po kolei i jedynym sposobem na wyeliminowanie spacji i interpunkcji jest uzycie tokenow łańcuchowych. Nie mogłem obejść problemu, gdy próbowałem usunąć spacje dla palindromu...

#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;

}
 -1
Author: geneemailbox1 geneemailbox1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 05:39:22