如何继承QVector?

mab*_*abg -1 c++ qt qvector qtcore

我有一个名为Symbol的类,我想创建一个QVector子类(Symbols)来添加一些有用的方法.但是当我使用来自另一个类A的符号时,编译器会给出错误'符号没有命名类型'.

class Symbols: public QVector< Symbol >
{
public:
    Symbols() {}

    // Useful methods
    QSymbol findSymbol(const QString &name);

    // ...
};

class A
{
private:
    Symbols symbols;
};
Run Code Online (Sandbox Code Playgroud)

它是否正确分类?

为什么在编译A类时出现'符号不命名类型'?

cpp*_*guy 9

通常不建议从容器中获取.你几乎总是想要一个"有A"关系,否则你的类会暴露你的类用户可以使用的成员,这可能会破坏状态.

此外,您似乎正在尝试在类中实现查找,这意味着QMap或QHash可能是更合适的容器

  • @Lazlo我清楚地了解QStringList是什么,并且id添加,我也清楚地了解了C++中的继承.整个虚拟析构函数参数是关于对象的破坏,而不是它有其他虚函数.如果没有虚拟析构函数,以下代码不会调用正确的析构函数:`QList*a = new QStringList(); 删除a;`这只调用`~QList()`,所以如果QStringList有任何成员或获取一些资源,就会出现泄漏.祝你好运这样的代码吧!这也是你永远不应该从STL容器继承的原因. (6认同)
  • QStringList不是继承的好例子.它扩展了QList <QString>的实例化,其中一些方法处理QString,但没有,并且不能覆盖任何虚函数.这有几个问题.首先,基类QList没有虚拟析构函数,这意味着它不是基类.然后,QList没有虚函数,因此在子类中没有特定于类型的行为的空间,这是继承的全部内容.扩展接口应该通过生成采用QList <QString>参数的自由函数来完成. (5认同)
  • @LaszloPapp 1. Liskov替代被侵犯.这是一个与语言无关的主要设计问题.2.您是否接受C++标准作为权威文章?它在第5.3节中说.通过基类指针删除具有非虚拟析构函数的对象是未定义的行为,例如它可能泄漏.3. Herb Sutter:"基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的." 来自http://www.gotw.ca/publications/mill18.htm,发表于C/C++ Users Journal,19(9),2001年9月,并由Herb Sutter和Andrei Alexandrescu在C++编码标准中重复. (2认同)