• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obiekty i klasy

Object Storage Arubacloud
0 głosów
345 wizyt
pytanie zadane 16 czerwca 2020 w C i C++ przez nifeone Początkujący (370 p.)

Witam. Męczę się od paru godzin i nie mogę wpaść na rozwiązanie. Nie chcę tutaj zasypywać Was całym kodem, więc pokrótce powiem o co mi chodzi. Mianowicie poniższa klasa korzysta z funkcji innych klas. Generalnie utworzyłem obiekty i nie wiem jak mógłbym je zastąpić lub po prostu zrobić to tak, by kompilator mi nie wyrzucał błędów o wielekrotnym obiekcie lub, że jest niezidyfikowany. Z tego co pamiętam był to błąd C2061. Nie pokażę teraz dokładnych logów, bo próbuję to zrobić w inny sposób. Myślałem o podawaniu obiektów w referencjach, ale wtedy byłoby ich zbyt dużo. Ktoś mi może podsunąć jakieś rozwiązanie? Jeśli będzie trzeba wszystkich kodów z 5 klas to wstawię. 

Na tym kodzie akurat teraz wszystko ok, ale jak dalej idę tym działaniem i robię podobnie w innych funkcjach to już nie działa. Bo np. w hud potrzebuję "game" by wyświetlić dzień. Z kolei w game potrzebuję "hud" by wyświetlić main menu. 

#include "HUD.h"


Game game;
Player player;
Resources resources;

};

//Huds
void HUD::ShowResources()
{
	std::cout << " | Wood: " << resources.GetWood() << " | Stone: " << resources.GetStone() <<" | Sticks: " << resources.GetStick() <<"] \n\n";
}
void HUD::ShowStats(Player& player)
{

	std::cout << "\n";
	std::cout << " | Day: " << game.GetDay() <<"\n";
	std::cout << " | Health: " << player.GetHp() << " | Energy: " << player.GetEnergy() << " |\n";
	std::cout << " | Level: " << player.GetLevel() << " | Starvation: " << player.GetStarvation() << "% |\n\n";

}

void HUD::CraftMenu()
{
	system("cls");
	ShowStats(player);
	ShowResources();
	std::cout << " [--- CRAFTING MENU ---] \n\n"
			  << " [0] Shelter [Wood: " << item[0].NeedWood << " Stone: "<< item[0].NeedStone  <<" Sticks: " << item[0].NeedStick <<" \n"
			  << " [1] Fire [Wood: " << item[1].NeedWood << " Stone: " << item[1].NeedStone << " Sticks: " << item[1].NeedStick << " \n"
			  << " [3] Back to Main Menu\n\n";
			  std::cin >> choice;

			  switch (choice)
			  {
			  case 0:

				  CraftMenu();
				  break;
			  case 1:
				 
				  CraftMenu();
				  break;
			  case 3:

				  MainMenu();
			  }
}
void HUD::MainMenu()
{
	
	system("cls");
	ShowStats(player);

	std::cout << " [--- MAIN MENU ---] \n\n"
		<< " [1] COLLECT\n"
		<< " [2] CRAFT \n"
		<< " [3] ...\n"
		<< " [4] RESEARCH \n\n";
		std::cin >> choice;

		switch (choice)
		{
		case 1:
			system("cls");
			ShowStats(player);
			resources.Collect();
			MainMenu();
			break;
		case 2:
			CraftMenu();
			break;

		case 3:

			break;

		case 4:
			system("cls");
			ShowStats(player);
			player.Research(); 
			MainMenu();
			break;
		default:

			break;
		}

}



 

komentarz 16 czerwca 2020 przez tkz Nałogowiec (42,000 p.)
Nie zupełnie. Nie wszystko dasz radę stworzyć w mainie. Możesz zawęzić "zakres" zmiennej do jednej jednostki kompilacji przez użycie static. Ale tak jak pisał Tom, staraj się deklarować wszystko lokalnie.
komentarz 16 czerwca 2020 przez nifeone Początkujący (370 p.)
No ale z kolei jeśli zdeklaruje obiekty lokalnie, to potem zostaną usunięte, a praktycznie wszystkie prace są dokonywane na tych pojedynczych obiektach. Ilość materiałów, ilość życia itp.
komentarz 16 czerwca 2020 przez tkz Nałogowiec (42,000 p.)
Hud w pliku game i resources jest w zamyśle tym samym hud'em? Dlaczego nie przesyłasz ich do obiektu? Dlaczego nie są polami obiektu, który na nich działa?
komentarz 16 czerwca 2020 przez nifeone Początkujący (370 p.)
Tak. Generalnie widocznie źle zostałem nauczony. Zrobiłem obiekty w main, potem przez referencję w metodach przekazywałem te obiekty, ale tak dużo tych referencji się zbiera, że nie ma sensu iść tą ścieżką. Bardzo dziękuję za porady, ale nadal nie mogę tego pojąć. Byłbyś mi w stanie pokazać to na przykładzie klasy HUD?
komentarz 16 czerwca 2020 przez tkz Nałogowiec (42,000 p.)

Mogę się postarać, ale mój talent pedagogiczne nie jest pierwszych lotów. Na Twoim kodzie będzie trudno przedstawić mój zamysł, więc po prostu opisze. Klasa resources powinna przyjmować w konstruktorze oryginał hud'u, klasa game również. 

int main()
{
    HUD hud;
    Game game(hud);
    Resources resources(hud);
    Player player;
    game.UpdateGame(player);
}

W samym gamedevie globalne obiekty nie są aż takim błędem, jak przy innych dziedzinach. Ale sam zamysł stworzyłbym tak jak wyżej. Tworze w mainie obiekty, które przesyłam przez referencję. Mam dziwne wrażenie, że u Ciebie HUD miał być singletonem, co nie jest najlepszym pomysłem. 

Pewnie ktoś piszący gry będzie miał lepszy pomysł, więc bym jeszcze zaczekał. 

1 odpowiedź

0 głosów
odpowiedź 16 czerwca 2020 przez TOM_CPP Pasjonat (22,640 p.)

Dodałem kilka istotnych zmian w strukturze klas, tak aby kod się kompilował. Zrobiłem to "na szybko", więc usunąłem wszystko to co niepotrzebne. Zobacz jaki jest teraz schemat kompozycji obiektów w klasach. Przed Tobą jeszcze długa droga aby gra zaczęła poprawnie działać, ale działający szkielet masz już gotowy.

#include <iostream>
#include <windows.h>
#include <time.h>

class Resources
{

private:
    int Clay {0}, Leaves {0}, Seed {0};

public:

    void SetDropRand(){}

    int Wood {0};
    int Stick {0};
    int Stone {0};

    int WoodRandom {0};
    int StoneRandom {0};
    int StickRandom {0};
};

class Player
{

private:

    double Exp {0}, ExpNext {0};

public:

    void Sleep(){}
    void Research(){}

    void SetStats()
    {
        Energy = Starvation = Health = 100;
        Level = 1;
    }

    double Health {0};
    int Energy {0};
    int Level {0};
    double Starvation {0};

};

class HUD
{

private:

    int Day {1};
    Resources resources;
    Player player;

public:


    void ShowResources()
    {
        std::cout << " | Wood: " << resources.Wood << " | Stone: " << resources.Stone <<" | Sticks: " << resources.Stick <<"] \n\n";
    }

    void ShowStats()
    {
        std::cout << "\n";
        std::cout << " | Day: " << Day <<"\n";
        std::cout << " | Health: " << player.Health << " | Energy: " << player.Energy << " |\n";
        std::cout << " | Level: " << player.Level << " | Starvation: " << player.Starvation << "% |\n\n";
    }

    void Timer( int Time )
    {
        while( Time >= 0 )
        {
            system("cls");
            ShowStats();
            std::cout << "\n\n [--- Searching " << Time << " ---]\n";
            Sleep(1000);
            Time--;
        }
    }

    void Collect()
    {
        resources.SetDropRand();
        Timer(2);
        system("cls");
        ShowStats();
        std::cout << "\n\n [--- Found ---]  \n\n";
        std::cout << " Wood: " << resources.WoodRandom << " Stone: " << resources.StoneRandom << " Sticks: " << resources.StickRandom << "\n";
        system("pause");
    }

    bool update()
    {
        int choice;
        system("cls");
        ShowStats();

        std::cout << " [--- MAIN MENU ---] \n\n"
        << " [1] COLLECT\n"
        << " [2] CRAFT \n"
        << " [3] ...\n"
        << " [4] RESEARCH \n\n"
        << " [5] EXIT \n\n";
        std::cin >> choice;

        switch (choice)
        {
          case 1:
            system("cls");
            ShowStats();
            Collect();
            break;
          case 2: break;
          case 3: break;
          case 4:
            system("cls");
            ShowStats();
            player.Research();
            break;
          case 5: return false;
          default: break;
        }

      return true;
    }
};

class Game
{
    HUD hud;

    void ShowIntro()
    {
        std::cout << "Some Intro\n";
        system("pause");
    }

public:

    void run()
    {
        ShowIntro();
        while( hud.update() ){};
    }

};

int main()
{
    Game game;
    game.run();

    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 489 wizyt
pytanie zadane 9 września 2020 w PHP przez Młody programista Obywatel (1,200 p.)
0 głosów
1 odpowiedź 269 wizyt
pytanie zadane 16 czerwca 2020 w C i C++ przez NieMamPojecia Nowicjusz (120 p.)
+1 głos
3 odpowiedzi 893 wizyt
pytanie zadane 14 kwietnia 2016 w JavaScript przez AV'ger Użytkownik (790 p.)

92,632 zapytań

141,502 odpowiedzi

319,882 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...