如何从向量类派生

时间:2019-05-24 16:38:27

标签: c++ vector

请帮助我了解如何从vector创建派生类。我知道不鼓励使用标准容器。

这是我的例子:

// Example program
#include <vector>

using namespace std;

struct Card
{
    int suit;
    int value;

    Card(int pSuit, int pValue) : suit(pSuit), value(pValue)
    {
    }
};

struct CardVector : public vector<Card>
{
    void removeCards(const CardVector &cardArr)
    {
        // todo
    }
};

int main()
{
    CardVector cardArr1;
    cardArr1.push_back(Card(1,1)); // works

    vector<Card> cardArr2{Card(1,1)}; // works
    CardVector cardArr3{Card(1,1)}; // doesn't compile

    return 0;
}

给出编译错误

In function 'int main()':
30:32: error: no matching function for call to 'CardVector::CardVector(<brace-enclosed initializer list>)'
30:32: note: candidates are:
16:8: note: CardVector::CardVector()
16:8: note:   candidate expects 0 arguments, 1 provided 
16:8: note: CardVector::CardVector(const CardVector&)
16:8: note:   no known conversion for argument 1 from 'Card' to 'const CardVector&'
16:8: note: CardVector::CardVector(CardVector&&)
16:8: note:   no known conversion for argument 1 from 'Card' to 'CardVector&&'

1 个答案:

答案 0 :(得分:3)

您可以通过using基类构造函数(以及其他方法)来实现

#include <iostream>
#include <vector>
#include <string>

struct Card {
    std::string name;
};

class CardVector : public std::vector<Card> {

    using std::vector<Card>::vector;                    //   <- like so

    void removeCards(const CardVector& cardVector) {}
    void appendCards(const CardVector& cardVector) {}
};

int main() {
    Card a{"A"}, b{"B"};
    CardVector cv = {a, b};
    for(auto& c : cv) {
        std::cout << c.name << "\n";
    }
}

...但是由于std::vector的析构函数不是虚拟的,因此请确保永远不要通过基类指针删除对象。

为避免日后头痛,请使用组合功能并为需要支持的功能创建代理功能。

“轨道竞赛”为编译错误提供了一些启示: 原因是缺少一个使用std::initializer_list的ctor,并解决了您可以添加一个构造函数(以std::initializer_list<Card>作为参数)或像我上面那样重用基类ctor的问题。 LRiO还共享了 VS to this day does an extra copy of ctor args when you inherit ctors like this ,如果您使用VS,这当然值得考虑。