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

Singleton C++, czy dobrze to zrozumialem?

VPS Starter Arubacloud
0 głosów
335 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)

Witam,

mam taki kod, nie dziala ale chodzi o sama koncepcje tego.

#include <iostream>

class Car{
    Car(){
        int pred, szyb, wyn;
        void v(){
            wyn=pred*szyb;
            return wyn;
        }
          }
        public:
   static Car & instance()
   {
       static Car a;
       return a;
   }
};

int main()
{
    std::cout << "Hello world!";
    return 0;
}

Tutaj jest kod i chodzi mi o ten singleton. A wiec tworze klase Car i w klasie wywoluje funkcje Car() i tam daje wszystkie funkcje? I jeszcze, gdzie mam zdefiniowac zmienne, jezeli rozbije to na 2 pliki? 

Dziekuje i pozdrawiam :)

1 odpowiedź

0 głosów
odpowiedź 11 grudnia 2016 przez criss Mędrzec (172,590 p.)
    Car(){
        int pred, szyb, wyn;
        void v(){
            wyn=pred*szyb;
            return wyn;
        }
          }

Definiujesz metode w konstruktorze?

Ma to wyglądać tak, żeby sie kompilowało chociaż. Metoda instance jest w porządku, ale reszte nie wiem skad żeś wytrzasnął. Masz zagwarantować, że będzie istniał tylko jeden obiekt tej klasy czyli konstruktor ma być prywatny i powinieneś stworzyć metode w stylu tej instance jaką masz. Następnie używasz obiektu w ten sposób:

Car::instance().v();

Singleton to nie jest jakiś magiczny twór. Pisz to jak wszystko inne, a nie ładuj definicje do konstruktora cokolwiek to by miało znaczyć.

komentarz 11 grudnia 2016 przez DragonCoder Nałogowiec (36,500 p.)

Okay,

static Car & instance()
   {
       static Car a;
       return a;
   }

to jest stale, ale czemu jest jeszcze to static Car a ? Czy to jest po prostu zeby singleton sie zwracal?

komentarz 11 grudnia 2016 przez efiku Szeryf (75,160 p.)
Lepiej zastosować Dependency Injection zamiast singletona;)

Chyba, że wiesz, że musisz go użyć.
komentarz 11 grudnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Uzywalem klas, ale chce zeby uzyc tylko jednego obiektu to znaczy tworze klase Car i obiekt car

Car car; I pozniej musze sie do tego odwolac z kropka car.funkcja(); tylko chce zeby te car bylo widoczne w calym projekcie i np, gdy uzywam tego w tym pliku, to jezei uzyje w drugim, to wszystko co bedzie juz wczesniej tam zostalo dopoki nie skonczy sie program.
komentarz 11 grudnia 2016 przez criss Mędrzec (172,590 p.)
Dzięki static obiekt utworzony w ciele metody (funkcji) nadal istnieje po jej wykonaniu.

static jest konieczne, żeby każde wywołanie instance() zwracało ten sam obiekt a nie za każdym razem tworzyło nowy.
komentarz 11 grudnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
#ifndef WARRIOR_H_INCLUDED
#define WARRIOR_H_INCLUDED

class Warrior{
    private:
    Warrior(int strengthWarrior=80, int staminaWarrior=8, int sleightWarrior=10, int intelligenceWarrior=8,
    int lengthWarrior=0, int widthWarrior=0, int lvlWarrior=1,
    int expWarrior=0, int pointForStatystickWarrior=0, double stateMoneyBeginnWarrior=500);
    
	int strengthWarrior;
	int staminaWarrior;
	int sleightWarrior;
	int intelligenceWarrior;
	double stateMoneyBeginWarrior;
	int pointForStatystickWarrior;
	int lengthWarrior;
	int widthWarrior;
	int expWarrior;
	int lvlWarrior;
protected:
	int minimalDamageWarrior;
	int maximalDamageWarrior;
	int damageWarrior;
	int defenceWarrior;
	int lifeWarrior;
	int manaPointsWarrior;
public:
    
    static Warrior & wojownik()
    {
        static Warrior warrior;
        return warrior;
    }
    
    
	std::string nameWarrior;

	int oneMoveToUpWarrior();
	int oneMoveToDownWarrior();
	int oneMoveToRightWarrior();
	int oneMoveToLeftWarrior();


	
	int onePointUpToStrengthWarrior();
	int onePointUpToStaminaWarrior();
	int onePointUpToSleightWarrior();
	int onePointUpToIntelligenceWarrior();

	int twoPointUpToStrengthWarrior();
	int twoPointUpToStaminaWarrior();
	int twoPointUpToSleightWarrior();
	int twoPointUpToIntelligenceWarrior();

	int threePointUpToStrengthWarrior();
	int threePointUpToStaminaWarrior();
	int threePointUpToSleightWarrior();
	int threePointUpToIntelligenceWarrior();

	int fourPointUpToStrengthWarrior();
	int fourPointUpToStaminaWarrior();
	int fourPointUpToSleightWarrior();
	int fourPointUpToIntelligenceWarrior();

	int fivePointUpToStrengthWarrior();
	int fivePointUpToStaminaWarrior();
	int fivePointUpToSleightWarrior();
	int fivePointUpToIntelligenceWarrior();
	
    void positionWarrior(); 


	void howSeeTheAttributsWarrior();
	void friend fightWithMonsterWarrior();
	void saveTheStatysticksWarrior();
	void readTheStatysticksWarrior();
	void giveNameForYourWarrior();

	int lvlUpWarrior();

    ~Warrior();
};

#endif

Czy teraz wyglada to lepiej?

komentarz 11 grudnia 2016 przez criss Mędrzec (172,590 p.)
Tak, to jest ok
komentarz 11 grudnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
A teraz gdy stworze Warrior warrior w pliku magmit.cpp i chce jej znowu uzyc w pliku metlik.cpp, to wystarczy ze uzyje Warrior::wojownik().oneMoveUp();? I nie wazne gdzie zdefiniuje tego warriora?
komentarz 11 grudnia 2016 przez criss Mędrzec (172,590 p.)
Tak
komentarz 11 grudnia 2016 przez DragonCoder Nałogowiec (36,500 p.)

Ostatnie pytanie, gdy rozbije plik na 2 pliki to jak mam to zdefiniowac, gdy robie to jak zwykle to nie dziala:/

static Warrior & wojownik()
    {
        static Warrior warrior;
        return warrior;
    }

 

Podobne pytania

0 głosów
2 odpowiedzi 174 wizyt
pytanie zadane 29 października 2016 w C i C++ przez easytodo Mądrala (5,380 p.)
0 głosów
2 odpowiedzi 1,562 wizyt
pytanie zadane 24 sierpnia 2015 w C# przez jegor377 Stary wyjadacz (13,230 p.)
0 głosów
4 odpowiedzi 588 wizyt
pytanie zadane 10 kwietnia 2017 w C i C++ przez niezalogowany

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...