将Vector传递给另一个班级

时间:2013-01-08 05:27:50

标签: c++ class vector

正如标题所暗示的那样,我正试图将一个矢量从一个类发送到另一个类..这是一些示例代码......

class Deck
{
    public:

    //constructor
    Deck(){}
    ~Deck(){} //deconstructor

//global for setting deck size
int SetDeckMultiplier;

    //Card SetUp
            //access vector
        std::vector<int> GetCopyOfVector(){return cards;}
            //set deck size based on multiplier
        void SetDeckSize();
            //shuffle card vector
        void shuffle();

    //End Card Setup

     protected:

     private:
std::vector <int> cards;

};

这基本上设置了一个向量,用int填充它,而不是改组整数。

我有第二堂课......

class Dealer: public Deck
{
  public:



  void Hit();
  void GetStoredDeck()
  {

    std::cout << cards.size() << std::endl;
  }
  void DealCard();
  void DealerScore();
  void IniDeal();
  void CardPositions();

  private:

};

我试图将矢量拉入此类,以便经销商可以使用整数。我可以使向量受保护,但.size()为0.有没有办法在第一个类中填充和洗牌后将它传递给这个类?

编辑:

我没有太多代码中的函数代码。我刚刚完成了骨架设置。

Deck.cpp

void Deck::SetDeckSize()
{
      for (int i = 0; i < (52 * SetDeckMultiplier); i++)
        {
        cards.push_back(i);
        }

    //set card values
      for (int i = 0; i > (52 * SetDeckMultiplier); i++)
      {
        cards[i] =  i;

      }

}

void Deck::shuffle()
{
    for (int i = 0; i < (52 * SetDeckMultiplier); i++)
        {
       int r = i + (rand() % ((52 * SetDeckMultiplier) - i)); // Random remaining position.

       int temp = cards[i]; cards[i] = cards[r]; cards[r] = temp; //swap cards

       while (cards[i] >= 52) cards[i] = cards[i] - 52; //loop to ensure correct number for display

        //std::cout << cards[i] << std::endl;//display random cards.. for now
    }
}

这是我必须填充向量并对元素进行洗牌的代码。

我想把洗牌后的矢量用在经销商类中。通过这种方式,经销商可以获得向量中的下一个元素并执行需要完成的操作。

我对size()的评价是,如果我使向量保护而不是私有,我可以通过继承使用向量,但它是空向量而不是填充和混乱的向量。

3 个答案:

答案 0 :(得分:1)

您需要做的是在Deck构造函数中将create cards 添加到cards。这只是一个简单的示例,它显示了基类和派生类之间的共享数据:

class Deck
{
public:
  Deck() : cards{1,2} {}    // C++11 supports initializer list
  virtual ~Deck() {}        // better declare base destructor as virtual

protected:                  // derived class can access protected base members
  std::vector <int> cards;  
};

class Dealer: public Deck
{
public:
  Dealer()   // Deck default constructor is called 
  {
  }

  void GetStoredDeck()
  {
     std::cout << cards.size() << std::endl;
  }
};

int main(int argc, char* argv[])
{
  Dealer dealer;
  dealer.GetStoredDeck();   // you should see 2 cards now?
  return 0;
}

答案 1 :(得分:1)

从您的代码开始(假设您已在cards中保护Deck),您可以使用您的经销商类:

Dealer dealer;
dealer.SetDeckSize();
dealer.shuffle();
dealer.GetStoredDeck();

然而,正如@Troy指出的那样,你的班级设计并不好看。 经销商不是套牌,因此Dealer不应该是Deck的子类。相反,Dealer应该包含Deck类的字段,如下所示:

class Dealer
{
  public:
  void Hit();
  void DealCard();
  void DealerScore();
  void IniDeal();
  void CardPositions();

  private:
  Deck deck;
};

答案 2 :(得分:0)

要在派生类cards中访问int vector Dealer必须声明它protected ...

从你的方法名称来看,我猜Deck::SetDeckSize()就是把cards放入其中的人。

所以,我猜你在调用Dealer::GetStoredDeck()之前没有调用过这个方法。