2013-08-27 136 views
0

假設您有兩個類「TwoDice」和「Die」。您希望兩個Die對象始終是TwoDice實例的一部分,因此您可以在構造函數中創建兩個Die對象。如何使用在構造函數中創建的對象

TwoDice::TwoDice() 
{ 
    Die die1; 
    Die die2; 
} 

然後您調用TwoDice對象的rollDice方法,該方法依次調用每個Die的滾動方法。

bool TwoDice::rollDice() 
{ 
    faceValue1 = die1.roll(); 
    faceValue2 = die2.roll(); 
} 

目前,該問題是,當我將它設置了這種方式,die1和die2沒有定義這是有意義的,因爲這些都是構造函數中只是局部變量。但是,當我使die1和die2專門爲TwoDice類定義了私有變量時,我收到了多個編譯錯誤。有沒有辦法讓這兩個Die對象公開,讓其他方法可以訪問它們?

這裏的TwoDice.cpp文件:

// TwoDice.cpp: TwoDice class method definitions 

#include "stdafx.h" 
#include "time.h" 
#include "TwoDice.h" 
#include "Die.cpp" 
#include "Die.h" 
#include <cstdlib> 
#include <iostream> 

using namespace std; 

TwoDice::TwoDice(void) 
{ 
    Die die1; 
    Die die2; 
} 

TwoDice::TwoDice(int d1, int d2) 
{ 
    Die die1(d1); 
    Die die2(d2); 
} 

void TwoDice::rollDice(void) 
{ 
    die1.roll(); 
    die2.roll(); 
} 

void TwoDice::getFaceValueDieOne(void) 
{ 
    faceValueDie1 = die1.getFaceValue(); 
} 

void TwoDice::getFaceValueDieTwo(void) 
{ 
    faceValueDie2 = die2.getFaceValue(); 
} 

bool TwoDice::isMatchingPair(void) 
{ 
    if(faceValueDie1 == faceValueDie2) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

bool TwoDice::isSnakeEyes(void) 
{ 
    if(faceValueDie1 == 1 && faceValueDie2 == 1) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

void TwoDice::display(void) 
{ 
    cout << "Die 1 = " << faceValueDie1 << endl; 
    cout << "Die 2 = " << faceValueDie2 << endl; 
} 

int TwoDice::getValueOfDice() 
{ 
    return faceValueDie1 + faceValueDie2; 
} 

而這裏的TwoDice.h文件:

// TwoDice.h: class definition file 

#pragma once 
class TwoDice 
{ 
    private: 
     int faceValueDie1; 
     int faceValueDie2; 
    public: 
     TwoDice(); 
     TwoDice(int, int);  
     void rollDice(); 
     void getFaceValueDieOne(); 
     void getFaceValueDieTwo(); 
     bool isMatchingPair(); 
     bool isSnakeEyes(); 
     void display(); 
     int getValueOfDice(); 
}; 

這裏是Die.cpp:

// Die.cpp: Die class method definitions 

#include "stdafx.h" 
#include "time.h" 
#include "Die.h" 
#include <cstdlib> 

using namespace std; 

Die::Die(void) 
{ 
    numSides = 6; 
    faceValue = 0; 
    srand((unsigned int)time(NULL)); 
} 

Die::Die(int n) 
{ 
    numSides = n; 
    faceValue = 0; 
    srand((unsigned int)time(NULL)); 
} 

int Die::roll() 
{ 
    faceValue = rand()%numSides + 1; 

    return faceValue; 
} 

int Die::getFaceValue() 
{ 
    return faceValue; 
} 

這裏是死。 h:

// Die.h: class definition file 

#pragma once 
class Die 
{ 
    private: 
     int numSides; 
     int faceValue; 
    public: 
     Die(); 
     Die(int n); 
     int roll(); 
     int getFaceValue(); 
}; 
+1

你應該把一個成員變量的代碼至少從這個代碼只是其設計無效。 – MasterPlanMan

+0

爲什麼Die實例不是成員變量? –

+2

#include「Die.cpp」:你爲什麼要那樣做? – SirDarius

回答

3

你所有的構造函數代碼似乎都聲明瞭堆棧變量。將班級更改爲具有Die成員變量。

class TwoDice 
{ 
    private: 
     int faceValueDie1; 
     int faceValueDie2; 
     Die die1; 
     Die die2; 
     // then as your code 

然後改變構造函數如下

TwoDice::TwoDice() 
{ 
} 

TwoDice::TwoDice(int d1, int d2) 
    : die1(d1), 
    die2(d2) 
{ 
} 

第二個構造告訴Die構造函數詮釋使用

+1

和OP在聲明TwoDice類之前不要忘記包含Die.h。我很確定「多個編譯錯誤」來自忘記移動#include聲明。 – SirDarius

+0

我們稱之爲「局部變量」。沒有理由讓你的成員變量不能在堆棧中。 –

+0

公平點。 「本地」是一種更精確的表達方式 – doctorlove

0

這些對象超出了範圍,並在構造函數結束時被破壞。要在課程的其他地方使用它們,請將它們聲明爲成員變量。

1

使它們成爲變量。

class Die 
{ 
public: 
    // construct the die, given a face value 
    Die(int value) : face_value_(value) 
    { 
    } 

    int get_value() const 
    { 
    return face_value_; 
    } 

    // randomize the face value based on rolling 
    void roll() 
    { 
    face_value_ = 1 + (rand() % number_of_faces_); 
    } 

private: 
    int face_value_; 
}; 

// encapsulates two dice  
class TwoDice 
{ 
public: 
    // construct each one (one_ and two_) with a specific starting value 
    TwoDice(int fv_one, int fv2) : one_(fv_one), two_(fv_two) 
    { 
    } 

    // roll (both) 
    void roll() 
    { 
     one_.roll(); 
     two_.roll(); 
    } 

    // These objects are member variables. They are 
    // owned by a specific instance of this class. 
    Die one_; 
    Die two_; 
}; 
相關問題