Ich versuche, die folgende C# Funktionalität in C++, aber es gibt jetzt viel mehr ich darüber nachdenken müssen neu zu schreiben:ein Objekt der abstrakten Basisklasse Art Vorlagen und/oder typeof() instanziiert mit
public abstract class Component
{
}
public class Entity
{
private List<Component> m_components = new List<Component>();
public T AddComponent<T>() where T : Component
{
if (typeof(T).IsSubclassOf(typeof(Component)))
{
T newComponent = Activator.CreateInstance<T>();
m_components.Add(newComponent);
return newComponent;
}
else
{
return null;
}
}
public Component AddComponent(Type t)
{
if (t.IsSubclassOf(typeof(Component)))
{
Component newComponent = (Component)Activator.CreateInstance(t);
m_components.Add(newComponent);
return newComponent;
}
else
{
return null;
}
}
}
Dies ist so weit, wie ich bekam:
class Component
{
Component() { }
~Component() { }
void OnCreate() = 0;
}
class Entity
{
public:
template<class N> void Entity::AddComponent()
{
N *newComponent = new N();
m_components->push_back(newComponent);
newComponent->OnCreate();
}
private:
std::vector<Component*> *m_components;
}
googeln und sich auf Vorlagen Lesung bis tat, aber an diesem Punkt, den ich glaube, ich brauche einen erfahrenen Programmierer auf diese anzuzeigen. Bin ich auf dem richtigen Weg? Ich erhalte "nicht aufgelöste externe Symbol" -Fehler und der C++ - Code validiert nicht, dass er eine Unterklasse des richtigen Typs erstellt. Ich weiß, dass dies ein paar Themen umfassen könnte, aber es wäre großartig, wenn mir jemand helfen könnte!
"typeof" ist ein C# Hack -spezifische. Obwohl es in C++ einige ähnliche Konstrukte gibt, werden sie als schlechte Programmierpraktiken angesehen. Die richtige Lösung ist hier, virtuelle Methoden entsprechend zu verwenden. –
@SamVarshavchik Danke für den Kommentar. Mir ist bewusst, dass "typeof" sowohl C# -spezifisch als auch unerwünscht zu verwenden ist. Ich hätte es wahrscheinlich nicht erwähnen sollen. Wenn Sie einen Moment Zeit haben, eine Antwort zu geben, wäre ich an Ihrem Vorschlag interessiert! –