0

引数として渡されるベクトルとクラス名を理解しようとしているので、この小さなプログラムがあります。プログラムは次のとおりです。

#include<iostream>
#include<vector>
using namespace std;

class objectclass{
public:
    void vec_try(){
        cout<<"print out something";
    }
};

class another{
public:
    void run();
    vector<objectclass *>ports;
    void add_obj(objectclass *p){
        ports.push_back(p);
    }
    };

void another::run(){
    //int j=0;
    ports[j]->vec_try();
}
int main(){
another a;
a.run();
system("pause");
return 0;
}

ベクトルでクラス名をオブジェクトとして渡してから、push_backを使用してそのベクトルに要素を挿入するのは問題ないという考えがありますが、関数add_obj(objectclass * p)で、の定義を変更したくない場合は、どのように値を渡すのですか?働き。私はこのような方法を知っています:

objectclass *p;
p= new objectclass[10]; 

しかし、私の関数はすでに定義されており、ports [i]を使用して関数vec_try()を呼び出したいので、値を渡す方法と、ports[i]でどのように機能するかがわかりません。私は基本的にこれについていくつかの説明が必要です。

4

1 に答える 1

1

関数はオブジェクトへのadd_objポインタを取りobjectclassます。したがって、ベクトルに要素を追加するには、次のことを行う必要があります。

another a;

objectclass obj1;  // Create an objectclass
a.add_obj(&obj1);  // Pass its address to add_obj

objectclass obj2;
a.add_obj(&obj2);

objectclass obj3;
a.add_obj(&obj3);

もちろん、あなたのベクトルはこれらのオブジェクトへのポインタを保持しています。これらのオブジェクトがスコープ外になり、破棄されると、これらのポインターは無効なオブジェクトを指したままになります。ただし、オブジェクトはの最後でのみ破棄されるため、ここでは問題になりませんmain

別の方法は、オブジェクトを動的に割り当てることです。

another a;
a.add_obj(new objectclass());
a.add_obj(new objectclass());
a.add_obj(new objectclass());

各行はオブジェクトを動的に割り当ててobjectclassから、そのオブジェクトへのポインタをに渡しますadd_objdeleteただし、最終的には何らかの方法でこのオブジェクトを作成する必要があります。

ベクトルに入る最初の要素のpush_backインデックスは0、2番目の要素のインデックスは1、3番目の要素のインデックスは2というようになります。

で、ベクトル内のすべてのオブジェクトを反復処理する場合はrun、次のように実行できます。

for (int i = 0; i < ports.size(); i++) {
  ports[i]->vec_try();
}

ご覧のとおり、これはベクトル内のすべての要素(0からports.size())をループし、それぞれを呼び出しますvec_try

イテレータを使用してこれを行うためのより良い方法がありますが、それは将来のレッスンのために残しておきます。

于 2013-03-26T15:37:45.423 に答える