2013-08-27 2 views
0

Скажем, у вас было два класса «TwoDice» и «Die». Вы хотите, чтобы два объекта Die всегда были частью экземпляра TwoDice, поэтому вы создаете два объекта Die в конструкторе.Как использовать объект, созданный в конструкторе

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

Затем вы вызываете метод rollDice объекта TwoDice, который, в свою очередь, вызывает каждый отдельный метод броска 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; 
} 

Вот Die. 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 не являются членами vars? –

+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 не должны забывать включать Die.h перед объявлением класса TwoDice. Я почти уверен, что «множественные ошибки компиляции» проистекают из того, что забыли переместить объявление #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_; 
}; 
Смежные вопросы