请帮助我了解如何从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&&'
答案 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,这当然值得考虑。