class Apple {
public:
Apple(int);
static int typeID;
private:
int id_;
};
Apple.cpp
#include "Apple.h"
Apple::Apple(int pID) {
id_ = pID;
}
Potato.h, Potato.cpp idéntica a Apple
almacenamiento. h
#pragma once
#include "Apple.h"
#include "Potato.h"
#include <vector>
class Storage {
public:
Storage();
template<typename foodName> void store(foodName * object){
(*getBasket<foodName>()).push_back(object);
};
template<typename foodName> int countSize(){
return (*getBasket<foodName>()).size();
};
private:
std::vector<Apple*> applebasket_;
std::vector<Potato*> potatobasket_;
template <typename foodName> std::vector<foodName*> * getBasket(){
std::vector<foodName*> * result;
switch(foodName::typeID){
case 0:
result = &applebasket_;
break;
case 1:
//result = &potatobasket_;
break;
}
return result;
}
};
Storage.cpp
#include "Storage.h"
int Apple::typeID;
int Potato::typeID;
Storage::Storage() {
Apple::typeID = 0;
Potato::typeID =1;
}
main.cpp
#include "Storage.h"
#include <iostream>
int main() {
Apple* apple;
Potato* potato;
Storage storage;
int i;
for(i = 0;i < 7;i++){
apple = new Apple(i);
storage.store<Apple>(apple);
}
std::cout<<storage.countSize<Apple>();
return 0;
}
Este código funciona y el tamaño de las salidas derecha del vector, pero si la línea en caso de sentencia switch (dentro Storage.h) es sin comentar, compilador (g ++) lanza " error: no se puede convertir 'std :: vector < Potato *> *' a 'std :: vector < Apple *> *' en la asignación ". Es como compilar probando ambos casos de todos modos, y no puedo encontrarlo y cómo evitarlo. Necesito ayuda con esto y tal vez algunos consejos sobre un todo (una interfaz para contenedores de diferentes tipos), he comenzado a aprender C++ recientemente y probablemente la forma en que trato de hacerlo aquí es un desastre total.
Usted ** ciertamente ** no debe establecer el 'typeID' en el constructor' Storage'. Pero +1 para una pregunta interesante. –