0

HTMLタグの属性の有効性をチェックするCTagクラスがあります。

class CTag {
  vector<string> m_attr; // list of attributes
  string m_tag;
 public:
  void CheckAttr (); // go through the vector and search for valid attributes
};

class CDiv : public CTag {

 public:
  CDiv( const string & tag ) {
    string attr[] = {"id","class"};
    /* I would like to save string and array to the main class :

    int size = sizeof(attr) / sizeof(string);
    m_attr.assign(attr,attr+size);
    m_tag = tag;

    but I can't because they are private
    */
  }
};

そして別のタグクラス...

主に:

CDiv a("<div class=\"haha\">);
CDiv b("<div hello=\"haha\">"); // wrong attribute

文字列の解析と有効な属性の検索に問題はありません。それらのデータを保存する方法がわかりません。セッターメソッドを作るべきですか?または、それらの変数を公開できますか?

ご協力いただきありがとうございます。

4

3 に答える 3

0

私のアプローチは次のようになります。

class CTag
{
public:
  CTag(string const &tag_)
   : m_tag(tag_) {}
  void CheckAttr();
protected:
  virtual vector<string> const &Attributes() const = 0;
private:
  string m_tag;
};

class CDiv : public CTag
{
public:
  CDiv(string const &tag_) : CTag(tag_)
  { if (m_vec_attr.empty()) m_vec_attr.assign(m_attrs.begin(), m_attrs.end()); }
protected:
  virtual vector<string> const &Attributes() const { return m_vec_attr; }
private:
  static vector<string> m_vec_attr;
  static std::tr1::array<string, 2> m_attrs;
     // the '2' needs to match the number of attrs, kind of a pain
};
std::tr1::array<string,2> CDiv::m_attrs = {"id","class"};
vector<string> CDiv::m_vec_attr;

単純型の初期化の問題は、コンストラクターでそれを渡すことによって示されます。これは、メンバーを初期化するための推奨される方法です。

配列/ベクトル fu は、C++11 を使用していない場合、ベクトルの初期化が難しいためです。もしそうなら、配列を捨てて、コンストラクタの初期化や変換を気にせず、静的ベクトルを初期化してください。{ "id", "class" }実際、そうであれば、リテラル引数を CDiv コンストラクターから CTag コンストラクターに渡すことができる場合があります。それをテストするためのコンパイラが手元にありません。

于 2013-05-25T01:05:35.243 に答える
0

キーワードを使用protected:

class CTag {
 protected:
 ^^^^^^^^^^

  vector<string> m_attr; // list of attributes
  string m_tag;

 public:
  ...
};

デフォルトのアクセスはprivateであり、プライベート セクションの項目は子供に対して非公開です。あなたが使用する場合protectd、子供たちはそれらにアクセスできます。

セッター/ゲッターを使用することをお勧めします。

class CTag {
  vector<string> m_attr; // list of attributes
  string m_tag;

 protected:
  void setTag(const string &tag)
  {
    m_tag = tag;
  }

 public:
  ...
};

これで、子は でタグを設定できますsetTag

于 2013-05-24T20:55:23.180 に答える
0

それらを作成するprotectedと、それらのデータ メンバーが派生クラスから見えるようになります。または、メンバーを保持し、セッター (おそらくゲッターも)privateを提供することができます。protectedprotected

    class CTag {
    public:
        void CheckAttr ();
    protected:
//  ^^^^^^^^^^
        void set_tag(std::string s)
        {
             m_tag = std::move(s);
        }
        void set_attributes(std::vector<string> attrs)
        {
             m_attr = std::move(attrs);
        }
    private:
        vector<string> m_attr; // list of attributes
        string m_tag;
    };

保護されたメンバーは、メンバーと同様にクラスの「外部から」アクセスできませんが、メンバーとは異なり、派生クラスからアクセスできます。CTagprivateprivate

于 2013-05-24T20:55:33.363 に答える