web-dev-qa-db-ja.com

C ++のクラスオブジェクトを関数パラメーターとして使用する方法

私は、パラメータとしてクラスオブジェクトを受け取る機能を持っているかどうかはわかりませんよ。助けがありますか?ここでは、以下の例です。

#include<iostream>

void function(class object); //prototype

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

基本的に、クラスオブジェクトをパラメーターとして受け取る関数を作成し、tempObject.variableなどの関数内でそれらのパラメーターを使用する方法について混乱しています。

これは混乱のようなものであれば申し訳ありませんが、私はC++の比較的新しいです。

31
James

classのみ*クラス定義を導入するために使用されるキーワードです。ローカルオブジェクトとしてまたは関数のパラメータのいずれかとして、新しいクラスのインスタンスを宣言するときにあなただけの(範囲内になければなりません)クラスの名前ではなく、キーワードclassそのものを使用しています。

例えば.

class ANewType
{
    // ... details
};

これは、クラス型であると呼ばれる新しいタイプANewTypeを定義します。

次に、これを関数宣言で使用できます。

void function(ANewType object);

その後、タイプANewTypeのオブジェクトを関数に渡すことができます。オブジェクトは関数パラメーターにcopiedされるため、基本型と同様に、パラメーターを変更しようとしても関数内のパラメーターのみが変更され、オブジェクトには影響しません最初に渡されました。

あなたは、関数本体内のコメントで示されるように関数の外でオブジェクトを変更したい場合は、参照(またはポインタ)でオブジェクトを取る必要があります。例えば。

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

関数本体でobjectのいずれかの使用は機能していないコピーに渡された実際のオブジェクトを参照することをこれは、構文の手段。すべての変更はこのオブジェクトを変更し、機能が完了すると表示されます。

[* classキーワードは、テンプレートの定義に使用されるが、それは別の被験者のさ。]

36
CB Bailey

最も単純な時:

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

もちろん、あなたはおそらく、オブジェクトを渡すために参照を使用する必要がありますが、私はあなたがまだそれらに持っていない疑いがあります。

11
anon

クラスinstances(オブジェクト)を渡したい場合は、

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

または

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

一方、class自体を「渡す」場合

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

class MyClass{
  int member;
  //...
};
MyClass object1;
6

私も同じことを求めていました。別の解決策は、メソッドをオーバーロードできることです。

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

呼び出しでは、引数はそれに応じて渡すオブジェクトに適合します。しかし、あなたは自分自身を繰り返す必要があります

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