Вступительное примечание: Я начал изучать C++ в колледже около месяца назад. Это для задания. Мы смотрим сейчас и не понимаем многие передовые концепции.Как передать класс (не объект) в качестве параметра в C++
tl; dr: давайте представим, что у вас есть Book
. Book
- динамический массив Pages*
. Каждый Page
может быть WrittenPage
или DrawnPage
. Если вы хотите распечатать все Pages
, вы используете virtual method
. Если вы просто хотите напечатать DrawnPages
или WrittenPages
, вам нужно будет сделать какую-то фильтрацию внутри Book
. Как это сделать? На данный момент я обнаружил, что вам понадобится typeid
или какое-то другое средство для сравнения subtype
каждого Page
. Если вы спешите что-то быстро и просто взглянуть на принятый ответ, @CantChooseUsernames. Это хорошо работает для моей проблемы. Если у вас есть еще какой-то опыт, я бы хотел услышать, что вы думаете о новом ответе на @ n.m. , Не допускайте, чтобы принятый в настоящее время ответ препятствовал вам комментировать или публиковать свои собственные, если вы считаете, что он привносит что-то новое и содержательное в обсуждение.
ORIGINAL ВОПРОС:
У меня есть класс MyObj это суперкласс TheseObj и ThoseObj.
Class TheseObj : public MyObj {
}
Class ThoseObj : public MyObj {
}
У меня есть еще один класс, который содержит зЬй :: вектор с указателями на экземпляры MyObj и не-статический метод, в котором я хочу перечислить только TheseObj:
Class MyClass {
private:
vector<MyObj*> vec;
public:
void listTheseObj() {
for each (myObj* obj in vec) {
if(typeid(*obj) == typeid(theseObj)) {
cout << *obj << endl;
}
}
}
}
Все операторы уже правильно перегружен.
Это прекрасно работает. Теперь проблема в том, что у меня гораздо больше мест, где мне нужно делать то же самое, поэтому мне нужен шаблонный метод, который может получить вектор GENERIC и класс TYPE, чтобы я мог сделать что-то вроде:
listObjects(class_name_here, vec);
мне удалось создать:
template <class T>
void listObjectsOfOneType(const type_info& class_name_here, const vector<T*>& vec) {
for each (T* obj in vec) {
if(typeid(*obj) == typeid(class_name_here)) {
cout << *obj << endl;
}
}
}
Но я не уверен:
- Если шаблонный метод является правильным
- Как я могу назвать это
Надеюсь, что я ясно дал понять, большое спасибо за ваше время.
«Это отлично работает» - возможно, для очень маленьких величин. Вы должны использовать виртуальные функции для запуска кода подтипа. 'typeid' в принципе никогда не подходит. –
Как насчет публикации чего-то более сложного? Если бы вы могли сделать несколько примеров, это было бы здорово. –
Я не знаю, какова ваша настоящая проблема. Действительно ли это перечисление объектов определенного типа или что-то еще? –