gpt4 book ai didi

c++ - 如何从 vector 类派生

转载 作者:行者123 更新时间:2023-11-30 01:34:28 25 4
gpt4 key购买 nike

请帮助我了解如何从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&&'

最佳答案

可以通过 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 的析构函数不是虚拟的,请确保您永远不会通过基类指针删除对象。

为避免将来出现问题,请使用组合并为需要支持的对象创建代理函数。

Lightness Races in Orbit 揭示了一些编译错误:原因是失踪的 ctor 采取了 std::initializer_list并解决这个问题,您可以添加一个构造函数(将 std::initializer_list<Card> 作为参数)或像我上面那样重新使用基类 ctor。 LRiO 还分享了 VS to this day does an extra copy of ctor args when you inherit ctors like this 如果您使用的是 VS,这当然值得考虑。

关于c++ - 如何从 vector 类派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56296536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com