English 中文(简体)
基础类别中共同受保护的数据成员?
原标题:Common protected data member in base class?
  • 时间:2010-06-10 21:37:35
  •  标签:
  • c++

我有一个基础班和几个衍生班。 衍生的类别使用一些共同数据,我能否把这些共同数据作为基类受保护成员? 我知道被保护的成员有时会放松控制,因此,我想知道是否有任何良好办法。

具体例子如下:

class Base{
public:
   virtual void foo() = 0;
   void printData();
protected:
   std::vector<std::string> mData;
}

class Dr1 : public Base{
public:
   virtual void foo(); //could change mData
}

class Dr2 : public Base{
public:
   virtual void foo(); //could change mData
}

如果我把mData带入1博士和2博士为私人成员,那么我就需要把它放在他们当中,而且由于打印数据需要进入数字数据,因此我无法在基地获得印刷数据,除非我提供打印数据,并在1博士和2博士中具有相同的功能,这对我来说并不重要。

如果不使用受保护的成员,是否有更好的办法处理这一问题? 谢谢。

最佳回答

考虑的一项设计是使mData成为私人项目,并将保护方法添加到基地,这些方法可共同操作数据,然后由D1博士和D2博士使用。

但是,在很多时候,离开 mData作为受保护的成员更有意义。 最好的办法将在很大程度上取决于你的班子的细节。

问题回答

这一点可以提出相当的论点。 在C++中添加了<条码>保护下<>条码>的数据,主要是因为Mark Linton希望其为正在设计的约谈室查询。 这似乎与C++的其他设计相当适合(显然) Bjarne赞同这一想法。 几年后,马克禁止在采访中使用受保护的数据成员,因为使用这些成员造成的ug数。 此后一段时间,Barbara Liskov就整个概念的理论和实际问题发表了讲话。

<>C++>设计和演变 Bjarne的结论是:“在回顾中,我认为protected是一个例子,请允许我提出好的理由和时装克服我更好的判断和接受新的特征的umb。

底层: d 我对贵国数据<编码>受保护有二和三方面的思考。 它现在可能看起来好,但维护可能是一个截然不同的故事。

我得出这样的结论:受保护的数据与一类公众数据一样差。 如果你永远需要改变受保护的数据,你将打破基地上的所有类别。 这些衍生课程与普通的“公共”用户一样,是你的基类客户。 我建议撰写保护出入功能,这些功能可按班级划分。 这给你带来了公共成员职能的所有好处:你可以改变执行工作,而不打断客户,如果需要,你可以很容易地增加仪器和错误核对。

只要所有衍生类别的成员都有意义,就应该将其归入基地类别。

我认为没有说明理由:

  1. If your interface (the abstract Base class) is frozen, then you would be forced to use that storage or break compatibility for your users.
  2. To avoid forcing your users to #include <string> and <vector>.

我认为,如果你不再把这个类别作为图书馆供他人分级,那么获得你的数据的分流就是大韩民国。 如果你真的想要或需要掩盖从子类中实际执行数据的情况,那么你可以私下制作<代码>mData,并创建可受保护的用户:

class Base {
protected:
    // figure out what interface you want for your subclasses:
    // do they need the whole enchilada? or can you give them
    // a few more targeted kinds of modification routines?
    // one example:
    void add_data(const std::string& d) { mData.push_back(d); }
private:
    std::vector<std::string> mData;
};




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签