[英]c++: Can you initialize data in a child class using the parents constructor?
我試圖找出是否可以使用由父類構造函數初始化的數據,然后使用它填充子類向量。 我一直在尋找這樣的東西,但最接近的是使用Parent構造函數初始化一個子類 ,但不幸的是這沒有幫助。
我的父母班級看起來像這樣
class Pile
{
protected:
vector<int> cards;
public:
Pile();
vector<int> getCards();
void shuffleDeck();
void dealHand();
void displayGame();
};
子班:
class Hand : public Pile
{
protected:
deque<int> hand1;
};
它的實現:
#include "Declarations.h"
Pile::Pile()
{
for(int i = 1;i <= 52; i++)
cards.push_back(i);
shuffleDeck();
// What I would like to do.
// dealHand();
}
理想情況下,我創建一副紙牌,將其洗牌,然后將它們分發到需要放置的位置(子類)。 我知道如何通過實例化子類,為它們創建方法並從父類傳遞向量來做到這一點,但這似乎很糟糕。
您能給我展示一種無需實例化Hand就將一個元素從“樁”類矢量“卡片”移動到其子類“手”的雙端隊列“ hand1”的方法嗎? 如果沒有,是否有比我的后備方法更直接的方法?
SomeCards
是SomeCards
紙牌。
class SomeCards {
std::vector<int> cards;
public:
SomeCards( std::vector<int> cards_in = {} ):cards(std::move(cards_in)) {}
std::vector<int> allCards() const { return cards; }
void shuffleCards(); // TODO
SomeCards drawCards(std::size_t count) {
std::vector<int> r;
for(std::size_t i = 0; i < count; ++i) {
if (!cards.empty()) {
r.push_back(cards.back());
cards.pop_back();
}
}
return r;
}
void addCards( SomeCards in ) {
cards.insert( cards.end(), in.cards.begin(), in.cards.end() );
}
};
Hand
牌是一些具有額外功能的卡。 另外,我們希望阻止交易。
class Hand : private SomeCards
{
public:
using SomeCards::allCards;
using SomeCards::addCards;
using SomeCards::SomeCards;
// TODO more?
};
Deck
也是一些具有額外功能的卡:
class Deck : private SomeCards
{
public:
using SomeCards::SomeCards;
using SomeCards::shuffleCards;
Hand drawHand(std::size_t size) {
return drawCards(size);
}
std::vector<Hand> drawHands(std::size_t count, std::size_t size) {
std::vector<Hand> r;
r.reserve(count);
for (std::size_t i = 0; i < count; ++i)
r.push_back( drawHand(size) );
return r;
}
std::size_t drawTo( Hand& hand, std::size_t count ) {
auto cards = drawCards(count);
hand.addCards( cards );
return cards.size();
}
};
然后,我們以此構建游戲:
class Game {
Deck deck;
std::vector<Hand> hands;
public:
// TODO
};
注意SomeCards
是從繼承而來的,但是是私下繼承的,因為我在上面進行了常見的操作(無法識別卡片的含義),並且我正在using SomeCards::operation
將它們注入到私有子級中。
交替處理甲板和手是有問題的。
我們還可以從SomeCards
剝離非常見功能並公開繼承。
這種設計使您可以編寫行為類似於Hand
的簡單OrderedHand
,但對其進行改組是有意義的。
我沒有做太多的嘗試來避免上面不必要的副本。
基類構造函數在初始化派生類成員之前運行。 因此,只有那些成員具有微不足道的初始化,它才能修改它們; 否則,在成員的生存期開始之前使用成員將是不確定的行為。
我建議您以不同的方式設計類,以避免此類需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.