2015-10-16 161 views
0

我有兩個類:「遊戲」類和「單元」類。從主類中實例化的另一個類訪問主類實例方法

在Main函數啓動程序後,遊戲被實例化。 內部遊戲類的構造函數我創建了一些「單元」類實例。

然後我想我的單位之一運行從我主要功能創建的遊戲類實例的方法(例如使用遊戲內置的隨機數字引擎)

這可能嗎?從此類中實例化的類訪問父實例方法的最佳方式是什麼?

由於我無法真正瞭解如何正確地做到這一點,我決定使用「靜態」方法,儘管我的第一個需要是使用一個類的實例。仍然無法得到它的工作.. 這是我從我的遊戲類的隨機使用(但不是我想要的類的實例),我只能運行靜態打印功能,但靜態隨機只拋出一個錯誤:LNK2001無法解析的外部符號「public:static class std :: random_device Game :: rgen」(?rgen @ Game @@ 2Vrandom_device @ std @@ A)

順便說一句mt19937給出了類似的錯誤。使用Visual Studio 2015年

#include <iostream> 
#include <random> 

class Game; 
class Unit; 

class Game 
{ 
public: 
    Game(); 
    static void printSomething(); // test function 

    static std::random_device rgen; // main game random generator 

    // a shorthand function for quick generating random numbers 
    static int rnd(int min, int max){ 
     std::uniform_int_distribution<int> uid(min, max); 
     return uid(rgen); 
    } 
    static double rnd(double min, double max){ 
     std::uniform_real_distribution<double> urd(min, max); 
     return urd(rgen); 
    } 
}; 

class Unit 
{ 
public: 
    Unit() { 
     std::cout << "unit created\n"; 
     Game::printSomething(); // this works 
     std::cout << "random num is " << Game::rnd(1,100) << "!\n"; // this doesn't work 
    } 
}; 

// ********************************************** // 
int main() 
{ 
    Game game; // main game instance 
} 

// ********************************************** // 

Game::Game() { 
    Unit * unit = new Unit; 
} 

void Game:: printSomething() { 
    std::cout << "Printing something!\n"; 
} 
+0

這似乎是一個很主觀的問題。我的選擇是選擇不同的類設計,並將隨機函數封裝在傳遞給「單元」的「隨機」對象中。 –

+0

爲什麼不傳遞生成器,似乎它值得擁有自己的類 –

回答

2

你得到這個錯誤,因爲

static std::random_device rgen; 

不被外部類中聲明。

你應該在類定義後添加以下行:

std::random_device Game::rgen (*any constructor arguments needed*); 

打印作品的原因是,因爲它不使用非聲明靜態變量的RGen。

+0

謝謝,但它仍然沒有回答主要問題,從主類中實例化的另一個類訪問主類實例方法的方式是什麼? – Shabrido

+1

@Shabrido爲此,你應該做一些谷歌研究:http://stackoverflow.com/questions/11405069/inner-class-accessing-outer-class –

+0

嘿..感謝這個鏈接,這幾乎是我正在尋找,相信我,我做了一些研究,但可能使用了錯誤的關鍵字。 – Shabrido

相關問題