私は基本クラスと2つの派生クラスを持っています。今、私は基本クラスのベクトルを作成したいと思います。新しい要素を追加すると、新しい要素のどのクラスがチェックされます。しかし、C++では、instanceOf
のような機能がないので、変数type
を追加してチェックする必要があります。ここに私のコードがあります。Distinc由来クラス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;
};
2つの派生クラス:別のクラスにおいて
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;
};
、私は要素の配列を作成します。
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;
}
};
私の質問はこれをどのように処理するかです。この状況のためのデザインパターンはありますか?感謝
C++に 'instanceof'があっても、あなたのクラスが多態性ではないので、ここでは動作しません。それについて学び、ベクトルの基底へのポインタを格納します。 'dynamic_cast'を試してみると、それぞれの要素の型が分かります。 – DeiDei
オブジェクトの種類に応じて切り替える必要がある場合...設計上の問題があります。オブジェクトを常に適切に使用します。リストの項目をキャストしたい場合は、より具体的なタイプにする場合は、下位レベルの抽象化のレバーにしたいと考えています。コード匂いと呼ばれています。この臭いが消えるデザインパターンがたくさんあります。このテーマのいくつかの本を読んでください。 –