静的メンバーの継承と C++ での保護について質問があります。心の状態を書くのは必ずしも簡単ではないので、十分に明確になることを願っています:)カスタムフォーマットでテキストファイルをロードするグラフィカルプログラム用の単純な(テキストパーサー)を書いています。現在、テキスト部分はほぼ完成しており、ここで、ファイルからロードしたデータをオブジェクトに供給するために、いくつかのオブジェクトを生成する必要があります。
この質問は、C ++の時間1に属していると思いますが、立ち往生しています。たとえば、テキスト ファイルからロードしたのは、LAYER と PLINE の 2 種類の論理「ノード」だけです。これらには、両方に共通する属性と共通しない属性もあります。LAYER と PLINE との関係は今ではまったく関係ありません。私を悩ませているのは、両方の属性を接続して処理する方法です。
両方の基本クラスとしてDataObjを選択したとします。LAYER と PLINE の両方に名前を付けることができるため、DataObj には「name」というメンバーがあります。LAYER には、レイヤーのみに共通の属性があります。"locked" であり、PLINE には pline にのみ共通の属性があります。"色"。物事を行う「学校のやり方」では、次のようになります。
/// i use const char* for everything to not complicate things ...
...
class DataObj {
...
const char* name;
...
}
...
class Layer : public DataObj {
...
const char* locked;
...
}
...
class Pline : public DataObj {
...
const char* color;
...
}
...
int main(){
Layer* l = new Layer();
l.name = "first layer";
l.locked = "false";
Pline* p = new Pline();
p.name = "wonderful line";
p.color = "0xFF3300";
}
...
今は、特にパーサーからのデータをオブジェクトに供給するときに、静的な型付きメンバー名 (および将来的にはそれらのアクセサー) を本当に気にしない方法で、より「動的に」実行したいと考えています。つまり、2 つのノード タイプのみで簡単に実行できますが、数十以上のノード タイプを使用することになります。
したがって、私がやりたい概念は、各ノード タイプ (クラス) に許可された属性のベクトルを「静的に」プッシュし、この属性がオブジェクトで許可されているかどうかをチェックし、解析中に設定することです。おそらく2つの重要なメンバーが必要です1. kvペアのstd::map、2つ目は特定のノードに許可された属性の静的ベクトルです。前に入力したコードに従ってください。
...
class DataObj {
...
static std::vector<const char*> allowedAttrs;
std::map <const char*, const char*> attrs;
private:
static bool isInit;
...
}
...
DataObj::DataObj(){
if(!isInit)
allowedAttrs.push_back("name");
isInit = true;
}
...
Layer::Layer(){
if(!isInit) // private static for Layer
allowedAttrs.push_back("locked");
}
...
Pline::Pline(){
if(!isInit) // private static for Pline
allowedAttrs.push_back("color");
}
...
私がここで得ている問題は、おそらく月から見えるものです。最初に新しいレイヤーを初期化し、次に新しい Pline を初期化すると、Pline は allowedAttrs ベクトルに名前、ロック、および色を持ちますが、これは正しくありません。「ロック」はレイヤー ノードに対してのみ有効である必要があるためです。
したがって、レイヤーオブジェクトの「locked」などの非一般的な属性に対してメンバー「allowedAttrs」が「プライベート」になるだけでなく、スーパークラス「DataObj」からの「パブリック」の性質を保持する方法で、この問題を解決する方法が必要です-そのため、「名前」などの共有属性をキャッチできます。言い換えれば、基本クラスまでの「継承フロー」を「中断」し、同じコードを何度も繰り返すノードクラス (オブジェクト) ごとに新しい変数を定義したくありません。(仮想変数のようなもの)。
この質問が(それほど)ばかげていないことを願っています。あなたの答えに本当に感謝します。