は、次のことを想定しますどのようにポインタをクラスオブジェクトのポインタの中にドラッグし、それらを再帰的に割り当ててポインタを返すか? C++
- 私は
Person
というクラスがあります:私はPerson
オブジェクトのリストを格納するLinked_List
データ構造を使用し
class Person {
public:
Person();
~Person();
int compare(const Person & compared); //compare the names using strcmp()
void display();
protected:
char * name;
int age;
};
- を:
class Linked_List {
public:
Linked_List();
~Linked_List();
Person * retreive(Person, Node *, int &);
void insert(Person);
int remove_all();
int display_all();
protected:
Node * head;
};
retrieve()
関数は、関数(再帰的)に渡される一方と同じ名前を持つPerson
オブジェクトのリストを返すべきです。
Person * Linked_List::retreive(Person target, Node * current, int & matches) {
if (current == NULL) {
Person * persons = new Person[matches];
return persons;
}
if (target.compare(current->getData()) == 0) {
return retreive(target, current->getNext(), ++matches); //recursive call
}
return retreive(target, current->getNext(), matches); //recursive call
}
この関数は三つの引数
1 - 私が探していた人になります。 (リスト上の他の名前と名前を比較する)
2-ヘッドポインタ。
3ターゲットの同じ名前のリストにあるPerson
のオブジェクトの番号Person
。 1で、この関数は基本的に再帰的にLinked_List
と毎回を通じて横断
が一致Person
が発見されたmatches
増加を(リストで発見されたのと同じ名前を持つ人の動的配列を割り当てるため)、その後、再帰呼び出しを行いますトラバースを続けるリストの終わりに達するまで、Person
の配列が動的に割り当てられます。それから私は自分の問題に到達する。私は、persons
の配列内の一致として見つかったPerson
の各オブジェクトを格納(割り当て)できる方法を見つけていない限り、この関数をうまく動作させる方法を考えることができませんでした。再帰呼び出し)。関数はPerson
の配列を返すので、その後、私は内書きます
:
だから、私が本当にやろうとしていますがこのような何か(これは間違っているが、ちょうど明確にするため)であります第二の条件
return (retreive(target, current->getNext(), matches))[matches++] = current->getPerson();
私はPerson
オブジェクトの配列に同じ名前を持つすべてのPerson
を保存したいが、私はまた、私は再帰呼び出しの最後に到達するまで待たなければならないので、私は一致する人数の正しいサイズで配列を初期化することができますが、私はまたPerson
オブジェクトの配列(*)を返す必要があります。
あなたは人を格納するために動的な繰り返し容器を使用すると考えましたか? ( 'std :: vector'やそれに類する実装のように)次に、最初に数えて2回リストを繰り返した後、正しいPersonの配列を返す必要はありません。 –
@ChrisBritt私は実際に2回横断していません。これが少し難しい問題です。ありがとう、私はあなたが提案したものを検討します。しかし、好奇心のために、問題解決のための解決策があるかどうかを待つか、そうでないかもしれません。 – Bader
ちょうど不思議なことに、 'compare'は一致すると0を返し、一致しない場合は0を返します。 (もしあなたが追加情報を渡しているのであれば、可読性のためにboolを使いたいかもしれません)。 –