Как получить из векторного класса - PullRequest
1 голос
/ 24 мая 2019

Пожалуйста, помогите мне понять, как создать производный класс из 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 Ответ

4 голосов
/ 24 мая 2019

Вы можете сделать это с помощью 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 не является виртуальным, убедитесь, что вы никогда не удалите объекты, даже если указатель базового класса.

Чтобы избежать головной боли в будущем, используйте композицию и создайте прокси-функции для тех, кого вам нужно поддерживать.

Гонки легкости на орбите проливают свет на ошибки компиляции: Причиной был отсутствующий ctor, принимающий std::initializer_list, и чтобы исправить это, вы можете либо добавить один конструктор (принимая std::initializer_list<Card> в качестве аргумента), либо повторно использовать ctor базового класса, как я делал выше. LRiO также поделился VS и по сей день делает дополнительную копию аргументов ctor, когда вы наследуете ctors вроде этого , что, безусловно, стоит учитывать, если вы используете VS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...