#c #templates
#c #шаблоны
Вопрос:
У меня есть следующий класс шаблона:
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) {}
Но я все еще получаю ошибку.
Комментарии:
1. Почему вы наследуете от
card
иvirtualCard
? Похоже, вам просто нужно наследовать отcar
.2. @NathanOliver Потому что я хочу дополнительно иметь статическую переменную, которая подсчитывает, сколько
moveAnywhere
карточек у меня есть. Вот почему я наследую шаблон сmoveAnywhere
. Если бы я наследовал только от card, тогда я бы посчитал только, сколькоcard
у меня есть.