残念ながら、なぜあなたが再帰的にロードを呼び出すのか分からないので、私は正確な答えを与えることはできません。私はあなたが探している答えは多態性を使用するつもりだと思います。
animal.h
#ifndef ANIMAL_H
#define ANIMAL_H
#include <iostream>
#include <string>
class Animal
{
public:
void load()
{
std::string fileName = this->getAnimalFilename() + ".csv";
std::cout << "fileName = " << fileName << std::endl;
}
protected:
virtual std::string getAnimalFilename() { return "Animal"; }
};
#endif //ANIMAL_H
dog.h
#ifndef DOG_H
#define DOG_H
#include <string>
#include <iostream>
class Dog : public Animal
{
protected:
virtual std::string getAnimalFilename() { return "Dog"; }
};
#endif //DOG_H
cat.h
#ifndef CAT_H
#define CAT_H
#include <iostream>
#include <string>
class Cat : public Animal
{
protected:
virtual std::string getAnimalFilename() { return "Cat"; }
};
#endif //CAT_H
と使用例(あなたが使用しなければならないことに注意してください。これは基本的な例です。ポリモーフィズムのオーバーライド機能を取得するための基本クラスへのポインタです。関数を仮想としてオーバーライドする必要があります。 n派生クラス)。
EDIT:以下のmain.cppは、生ポインタを使用し、@ArchbishopOfBanterburyによって指摘されたメモリリークを引き起こしたため、スマートポインタを使用するように編集されました。
main.cppに
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include "animal.h"
#include "dog.h"
#include "cat.h"
int main(int argc, char *argv[])
{
std::vector<std::unique_ptr<Animal>> animalColl;
animalColl.emplace_back(new Dog());
animalColl.emplace_back(new Cat());
animalColl.emplace_back(new Cat());
animalColl.emplace_back(new Dog());
for (auto &a : animalColl) {
a->load();
}
return 0;
}
そして出力:
fileName = Dog.csv
fileName = Cat.csv
fileName = Cat.csv
fileName = Dog.csv
基本的な考え方は、基本クラスへのポインタを使用しているときに動作を上書きするキーワード仮想を使用することです。したがって、私の例では、getAnimalFilenameはDogおよびCatクラスでオーバーライドされ、load()関数に渡すのではなく正しい文字列を返します。それはどんなことに役立ちますか?先に進んでこのコメントに返信して、私ができる限り多くのことを助けようとします。
'dynamic_cast'を使用しますか? – Arunmu