0

我有一个 CTag 类,它检查 HTML 标签属性的有效性。

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

我解析字符串和搜索有效属性没有问题。我只是不确定如何保存这些数据。我应该制作一个setter方法吗?或者我可以公开这些变量吗?

谢谢你的帮助。

4

3 回答 3

0

使用关键字protected

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

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

 public:
  ...
};

默认访问权限是private,带有私有部分的项目对孩子来说是私有的。如果您使用protectd孩子们可以访问它们。

更好的做法是使用 setter/getter:

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并提供一个protectedsetter(可能也是一个protectedgetter)。

    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;
    };

受保护的成员不能从您的类的“外部”访问CTag,就像private成员一样,但与private成员不同的是,它们可以从派生类访问。

于 2013-05-24T20:55:33.363 回答
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;

初始化简单类型的问题通过在构造函数中传递它来显示;这是初始化成员的首选方法。

如果您不使用 C++11,则数组/向量 fu 是由于初始化向量的困难。如果是,那么放弃数组,不要打扰构造函数初始化或转换,只需初始化静态向量即可。事实上,如果你是,你可以将一个文字{ "id", "class" }参数从 CDiv 构造函数传递给 CTag 构造函数;我手头没有编译器来测试它。

于 2013-05-25T01:05:35.243 回答