aşağıdaki varsayalım:İşaretçi, sınıf nesnelerinin bir işaretçisinin içine nasıl sürüklenir ve bunları yinelemeli olarak atayıp işaretçi döndürür? C++
- Ben
Person
bir sınıf olarak adlandırılan:class Person { public: Person(); ~Person(); int compare(const Person & compared); //compare the names using strcmp() void display(); protected: char * name; int age; };
Person
nesnelerin bir listesini depolamak için birLinked_List
veri yapısını kullanmak :
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()
işlevi bir fonksiyonu (yinelemeli) geçirilen ile aynı isme sahipPerson
nesneler listesi döndürmelidir.
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
}
Bu fonksiyon alır üç argümanlar
1- aradığım kişi. (Listeyi diğerleriyle karşılaştırmak için)
2- Baş ibre. (Listede yinelemeli olarak geçiş yapmak için) Person
Person
hedefinin aynı adıyla listede bulunan Person
nesnelerinin sayısı. teker Bu fonksiyon temelde yinelemeli Linked_List
ve her zaman içinde geçtiği
bir maç Person
bulunursa matches
artış (listede bulunmuştur aynı isimde kişilerin dinamik dizi tahsis etmek) ve daha sonra yinelemeli çağrı yapmak Traversing tutmak için. Listenin sonuna ulaşılana kadar, Person
nesnesi dizisi dinamik olarak ayrılır. Sonra problemime ulaşırım. Bu işlevi başarılı bir şekilde çalışması için bir yol düşünemedim, UNLESS persons
dizisinin içinde eşleşmenin sonunda döndürülecek Person
nesnesinin bir eşleşmesini (atama) yapmamı sağlayan bir yol buluyorum. özyinelemeli çağrı.Fonksiyon Person
dizisi döndürür
yana, sonra ben içine yazacağım:
Peki gerçekten yapmak çalışıyorum böyle bir şey (Bu ama sadece konuya açıklık getirmek amacıyla, yanlış) 'dir ikinci koşul
return (retreive(target, current->getNext(), matches))[matches++] = current->getPerson();
Ben Person
nesnelerin bir dizideki aynı ada sahip her Person
depolamak istediğiniz, ama aynı zamanda özyinelemeli aramanın sonuna ulaşıncaya kadar beklemek zorunda Diziyi, eşleştirilen kişi sayısının doğru boyutuna göre başlatabilirim, YET Ayrıca bir nesneyi değil Person
nesnesinin bir nesnesini (*) döndürmem gerekiyor.
Kişileri saklamak için dinamik bir yineleme konteyneri kullanmayı düşündünüz mü? (“Std :: vector” veya benzer bir uygulama gibi) Sonra, ilk önce onları saymadan önce iki kez tekrar etmenize gerek kalmayacak ve bir dizi doğru kişiyi geri getireceksiniz. –
@ChrisBritt Aslında iki kez geçmiyorum, bu yüzden bu biraz zor bir sorundur. Yine de teşekkürler, önerdiğin şeyi düşüneceğim. Ancak, merak uğruna, benim sorunum için bir çözüm olup olmadığını görmek için sabırsızlanıyorum VEYA belki de değil. – Bader
Sadece merak, 'compare' bir eşleşme için 0 ve bir eşleşme için değil! (Ondan ek bilgi aktarıyor musunuz? Değilse, okunabilirlik amacıyla bir bool kullanmak isteyebilirsiniz.) –