#c #class #dependencies
#c #класс #зависимости
Вопрос:
Эй, итак, у меня есть три класса 2: Screen и Sprite: которые зависят друг от друга, поэтому, если я определю один, я не смогу реализовать второй класс, который будет определен в нем, поскольку он еще не определен! Есть ли какое-либо простое решение для этого, которое не требует большого перекодирования?
Вот определение каждого класса (Map также является классом):
класс Sprite: move() не будет работать без определения класса Screen….
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// Sprite Class ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Sprite
{
public:
///////////////////// Get and SET all the privates ///////
Sprite(){};
Sprite(string a_name, char a_symbol, float a_health){
_name = a_name;
_symbol = a_symbol;
_health = a_health;};
char get_symbol() {return _symbol;};
void set_symbol(char _sym) {_symbol = _sym;};
float get_health() {return _health;};
void set_health(float _numb) {_health = _numb;};
void add_health (float _numb) {_health = _numb;};
string get_name() {return _name;};
string set_name(string _aName) {_name = _aName;};
int* get_location(){return _location;};
void set_location(int X, int Y) {
_location[0] = X;
_location[1] = Y;};
//////////////////////////////// Move ////////////
// WONT WORK UNTIL UNLESS SCEEN CLASS IS DEFINED BEFORE IT
bool move(Screen screen,int X, int Y)
{
bool OK = true;
////////////////////// check whats already there /////
char newLoc = screen.get_contents(_location[1] Y,_location[0] X);
if (newLoc == '|' || '/' || '_' || '=' || 'X' || 'x' )
OK = false;
if (OK == true)
{
_location[0] = X;
_location[1] = Y;
return true;
}
else
return false;
};
private:
string _name;
char _symbol;
float _health;
int _location[2];
};
И класс screen: (перегруженная функция вставки sprite не будет работать без Sprite def.
///////////////////////// SCREEN CLASS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Screen
{
private:
/////////////////////////////////////////// Screen Variables ///////////////
string _name;
vector <string> _contents;
public:
Screen(string name){_name = name;
_contents.resize(24);};
~Screen(){};
//////////////////////////////////////////// Get contents ///////////////////////////
string get_contents(int Y) {return _contents[Y];};
char get_contents(int X, int Y) {return _contents[Y][X];};
//////////////////////////////////////////// Display (1 FPS) ///////////////////////////
void Display(int numbRefreshes) //
{ //
for(int t = 0; numbRefreshes > t;) //
{ //
UL_2 = GetTickCount() overSec-UL_1; // Get Time in Milliseconds since start //
// GATE TO GETTING INTO THE DISPLAY FUNCTION (every 1 sec)
if (UL_2 >= 1000) //
{ //
overSec = 1000 - UL_2; //
// Wait another second before update (1000 milliseconds) //
UL_1 =1000; //
UL_3 = 1; //
char UL_3_string[6]; //
itoa(UL_3, UL_3_string, 10); //
// Tell the for loop 1 render is complete (/////)
t =1; // (///)
// Update the time counter (/)
int B = sizeof(UL_3_string); // |
for(int I = 0; I < sizeof(UL_3_string); I )
Screen::Insert(UL_3_string[I], 38 I, 22);
/////////////////// Draw each line of the Screen
for (unsigned int I = 0; I < _contents.size(); I )
{
cout << _contents[I];
}
//////////////// draw any empty lines NOT WORKING WTF???????
for(int emptyLines = 24-_contents.size(); emptyLines > 0; emptyLines--)
{
cout << endl;
}
}
}
};
/////////////////////////////////////////// Insert ////////////////////////
/////////////////// map
bool Insert(Mapamp; _map)
{
for (unsigned int I = 0; I<_map.getContents().size();I )
{
_contents[I] = _map.getContents()[I];
}
return true;
};
/////////////////// string
bool Insert(string _string, int Y)
{
_contents[Y] = _string;
return true;
};
///////////////////// char
bool Insert(char _char, int X, int Y)
{
_contents[Y][X] = _char;
return true;
};
//////////////////// sprite
bool Insert(Spriteamp; _sprite)
{
_contents[_sprite.get_location()[0]][_sprite.get_location()[1]] = _sprite.get_symbol();
};
};
Screen theScreen («Экран»);
Спасибо за любую помощь!! =)
Ответ №1:
Я бы изменил дизайн — я не понимаю, зачем спрайту нужно знать об экране. И что это:
if (newLoc == '|' || '/' || '_' || '=' || 'X' || 'x' )
предполагается, что это делается? Это не то, как вы тестируете вещи в C .
Другие проблемы — не передавайте строки по значению, передавайте их как ссылки const и не начинайте имена с подчеркивания.
Комментарии:
1. Имена, начинающиеся с подчеркивания, разрешены; только имена, начинающиеся с двойного подчеркивания, могут вызвать проблемы (в частности, потенциальные конфликты пространства имен с токенами, специфичными для компилятора). Что касается того, хороший это стиль или нет, это спорно — но я нахожу это полезным как способ сделать очевидным, какие имена являются переменными-членами (потому что m_ как префикс слишком многословен ; ^))
2. @Jeremy Я предлагаю вам еще раз взглянуть на стандарт C . Имена, начинающиеся с одного подчеркивания и любые другие, зарезервированы в глобальной области видимости. Имена, начинающиеся с одного подчеркивания и заглавной буквы, зарезервированы во всех областях. Имена, которые содержат (а не просто начинаются с) двойное подчеркивание, зарезервированы во всех областях.
Ответ №2:
Сначала разделите свои классы на .h файлы и .cpp файлы, затем используйте forward declaration (погуглите для этого, я не могу опубликовать ссылку). В вашем коде есть несколько других ошибок, вам может понравиться книга Бьярне Страуструпа «Язык c »