2015-10-16 1 views
0

У меня есть два класса: класс «Игра» и класс «Единица».Доступ к методам экземпляра основного класса из другого класса, созданного в основном классе

Игра создается сразу после запуска программы в функции Main. Внутри конструктора класса «Я» я создал несколько экземпляров класса «Единица».

Тогда я хочу один из моих единиц, чтобы запустить метод из класса Game Например, я создал в главной функции (например, чтобы использовать Game встроенный в случайных чисел двигателя)

Возможно ли это? Каков наилучший способ доступа к методу экземпляра родителя из класса, созданного в этом классе.

Поскольку я не мог понять, как правильно это сделать, я решил использовать «статический» метод, хотя мои первые потребности заключались в использовании экземпляра класса. Все еще не удалось заставить его работать. Это мой пример использования случайного из моего класса Game (но не экземпляр этого класса, как я и хотел), мне удалось запустить только статическую функцию печати, но статические случайные просто бросают ошибка: 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

Это похоже на довольно субъективный вопрос. Моим выбором было бы выбрать другой класс, со случайными функциями, инкапсулированными в объект «Случайный», который вы передаете в «Unit». –

+0

Почему бы не пропустить генератор вокруг, кажется, что он заслуживает своего класса –

ответ

2

Вы получаете эту ошибку, так как

static std::random_device rgen; 

не объявлен вне класса.

Вы должны добавить следующую строку после определения класса:

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

Причины, по которой печати работы является, так как он не использует недекларируемую статическую переменную RGEN.

+0

, но он все еще не отвечает на главный вопрос, каков способ доступа к методам экземпляра основного класса из другого класса, созданного в основном классе? – Shabrido

+1

@Shabrido Для этого вам нужно было провести исследование google: http://stackoverflow.com/questions/11405069/inner-class-accessing-outer-class –

+0

Привет, спасибо за эту ссылку, это в значительной степени то, что я искал, поверьте, я сделал некоторые исследования, но, вероятно, использовал неправильные ключевые слова. – Shabrido

Смежные вопросы