【发布时间】:2012-09-22 18:40:01
【问题描述】:
我确实有关于静态成员继承及其在 C++ 中的保护的问题。我希望我会足够清楚,因为编写思维状态并不总是那么容易:) 我正在为一个图形程序编写一个简单的(文本解析器),该程序正在加载具有自定义格式的文本文件,现在文本部分几乎完成了并且现在我需要生成一些对象来为它们提供我从文件中加载的数据。
我相信这个问题属于 C++ 的第 1 小时,但我卡住了。例如,我从文本文件中加载了 2 种类型的逻辑“节点”,即 LAYER 和 PLINE,它们还具有它们可以或不能对两者通用的属性。 LAYER 与 PLINE 和 back 的关系现在完全无关紧要,困扰我的是如何连接和处理两者的属性:
假设我选择 DataObj 作为两者的基类。 DataObj 有一个名为“name”的成员,因为 LAYER 和 PLINE 都可以有一个名称。 LAYER 有一个属性,该属性仅对图层通用,例如。 “锁定”,并且 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,第二个是某些节点允许属性的静态向量。按照之前输入的代码:
...
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 向量中具有名称、锁定和颜色,这是不正确的,因为“锁定”应该只对层节点有效。
所以我需要一些方法来解决这个问题,即成员“allowedAttrs”对于不常见的属性(如 Layer 对象中的“锁定”)变为“私有”,但也保留其来自超类的“公共”性质“ DataObj” - 因此它可以捕获“名称”等共享属性。换句话说,我不想“破坏”到基类的“继承流”,并为每个节点类(对象)定义新变量,一遍又一遍地重复相同的代码。 (类似于虚拟变量)。
我希望这个问题不是(那么)愚蠢,并且非常感谢您的回答。
【问题讨论】:
-
请让您的问题简明扼要。它将帮助您快速获得答案。
-
作为基类构造函数首先被调用,其他push_backs会发生吗?
-
我认为你完全误解了
static的工作原理 -
i use const char* for everything to not complicate thingsIMO 不正确。你应该改用std::string。 -
const char* 有什么问题?
标签: c++