2015-10-16 164 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

相关问题