Ich habe eine Basisklasse und zwei abgeleitete Klassen. Jetzt möchte ich einen Vektor der Basisklasse erstellen. Wenn ich ein neues Element hinzufüge, prüft es, welche Klasse des neuen Elements. Aber in C++ gibt es keine Funktion wie instanceOf
, also muss ich Variable type
hinzufügen, um zu überprüfen. Hier mein Code.Distinc abgeleitete Klasse C++
class Element {
public:
int type;
int getIndex() const {
return index;
}
void setIndex(int index) {
this->index = index;
}
const std::string& getMsg() const {
return msg;
}
void setMsg(const std::string& msg) {
this->msg = msg;
}
std::string toString() {
std::stringstream sbuf;
sbuf << "index: " << index << "\n";
sbuf << "Message: " << msg << "\n";
return sbuf.str();
}
private:
int index;
std::string msg;
};
Zwei abgeleitete Klasse:
class This: public Element {
public:
This():Element(1){}
~This();
const std::vector<std::string>& getArguments() const {
return arguments;
}
void setArguments(const std::vector<std::string>& arguments) {
this->arguments = arguments;
}
void add(std::string value) {
arguments.push_back(value);
}
private:
std::vector<std::string> arguments;
};
class That: public Element {
public:
That():Element(2){}
~That();
const std::string& getThatVal() const {
return thatVal;
}
void setThatVal(const std::string& thatVal) {
this->thatVal = thatVal;
}
private:
std::string thatVal;
};
In einer anderen Klasse, möchte ich das Array von Element erstellen.
class Visitor {
private:
int numOfThis = 0;
int numOfThat = 0;
std::vector<Element> vecEle;
public:
void add(Element ele) {
vecEle.push_back(ele);
if (ele.type == 1) {
numOfThis++;
} else if (ele.type == 2) {
numOfThat++;
}
}
int getNumOfThat() const {
return numOfThat;
}
int getNumOfThis() const {
return numOfThis;
}
};
Meine Frage ist, wie man damit besser umgehen? Gibt es ein Entwurfsmuster für diese Situation? Dank
Auch wenn es in C++ "instanceof" gab, würde es hier nicht funktionieren, da Ihre Klassen nicht polymorph sind. Erfahren Sie mehr darüber und speichern Sie Zeiger, die in einem Vektor basieren. Wenn Sie versuchen, zu "dynamic_cast" zu wechseln, wird Ihnen angezeigt, um welchen Typ es sich bei jedem Element handelt. – DeiDei
Wenn Sie nach dem Typ des Objekts wechseln müssen ... Es gibt ein Designproblem. Benutze die Objekte immer richtig ihre Typen. Wenn Sie die Elemente der Liste umwandeln möchten, möchten Sie einen spezifischeren Typ verwenden, den Sie auf eine niedrigere Ebene von Abstraktionen anwenden können. Es wird ein Code-Geruch genannt. Es gibt viele Design-Muster, um diese Gerüche zu verschwinden. Lesen Sie einige Bücher zu diesem Thema. –