У меня есть следующий шаблон класса:
template<typename T> class virtualCard
{
private:
static int numCards;
const int maxCards;
public:
virtualCard(int); //I want to manage all card construction from here
virtual ~virtualCard();
virtual void activate() = 0;
};
template<typename T> int virtualCard<T>::numCards = 0;
template<typename T> virtualCard<T>::virtualCard(int max) : maxCards(max)
{
if (numCards < maxCards)
++numCards;
else
throw std::logic_error("All these cards are on other people's hand, you can not draw any.");
}
Тогда, насколько я понимаю, каждый экземпляр шаблона будет иметь свои numCards
и maxCards
.
Итак, у меня есть класс card
, который является абстрактным классом, который учитывает только общее количество карт в игре.
class card : public virtualCard<card>
{
public:
card();
virtual ~card();
virtual void activate() = 0;
};
card::card() : virtualCard(13) {} //there is a maximum of 13 cards in-game at any given time
card::~card() {} //don't do anything, it is all managed from the template class
Но тогда у меня возникает проблема, когда я хочу создать данную карту, например:
class moveAnywhere : public card, public virtualCard<moveAnywhere>
{
public:
moveAnywhere();
virtual ~moveAnywhere();
virtual void activate();
};
Как мне вызвать конструктор этой карты?
Я пытался moveAnywhere::moveAnywhere() : card(), virtualCard(3) {}
Мое намерение состояло в том, что создание карты moveAnywhere
создаст card
(поэтому счетчик card
автоматически увеличивается на единицу. И, кроме того, у меня будет свой собственный moveAnywhere
статический счетчик, если вызвать virtualCard<moveAnywhere>
с помощью 3
в качестве аргумента (поскольку максимальное количество этих карт равно 3, для card
выбрано 13).
Проблема в том, что я получаю «Неоднозначный доступ к virtualCard
», я попытался явно изменить конструкторы:
card::card() : virtualCard<card>(13) {}
moveAnywhere::moveAnywhere() : card(), virtualCard<moveAnywhere>(3) {}
Но я все еще получаю ошибку.