Nadawanie wartośći pól obiektu

2011-09-29 14:45
0

Mam mały problem programistyczny :)
Stworzyłem sobie klasę

class cPart
{
public:
   int attack,defense,hp;
std::string name;

cPart()
{
attack=0;
defense=0;
hp=0;
}

};

Problem polega na tym, że nie za bardzo mam pojęcie jak nadać wartości poszczególnym tworzonym obiektom. Każdy stworzony obiekt może przyjąć 30 różnych wartości. Może powinienem napisać 30 konstruktorów lub jedną wielką funkcję która zależnie od podanego ID (0-29) nada odpowiednie wartości polom? Nie oczekuje gotowych odpowiedzi tylko delikatnego nakierowania mnie na wygodne oraz wydajne rozwiązanie. :)

Pozostało 580 znaków

2011-09-29 14:53
Rev
0

Stwórz jakąś mapę z fabrykami dla tych twoich obiektów. Wtedy będzie wystarczyło zrobić np. mapa["ogr"]->stwórz("stefan").
Słowa kluczowe dla Googli: factory, named constructor idiom.


Pozostało 580 znaków

2011-09-29 15:05
0

albo tak:

#include <string>
#include <iostream>

using namespace std;

class cPart
{
public:
   int attack,defense,hp;
   std::string name;

  cPart()
   {
    attack=0;
    defense=0;
    hp=0;
    name = "";
   }

  template<class T, class B>
  cPart(T cPart::* pole, B wartosc)
   {
    cPart();
    this->*pole = T(wartosc);
   }

  void wypisz()
    {
      cout << " att:" << attack << endl;
      cout << " def:" << defense << endl;
      cout << "  hp:" << hp << endl;
      cout << "name:" << name << endl << endl;
    }
};

int main()
{
  cPart a,b(&cPart::attack, 5),c(&cPart::name,"lol");
  a.wypisz();
  b.wypisz();
  c.wypisz();
  return 0;
}

░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-09-29 15:08
0

albo tak (to nie jest podwojony post):

#include <string>
#include <iostream>

using namespace std;

class cPart
{
public:
   int attack,defense,hp;
   std::string name;

  cPart()
   {
    attack=0;
    defense=0;
    hp=0;
    name = "";
   }

  cPart& setAttack(int _attack) { attack = _attack; return *this; }
  //...
  cPart& setName(string _name) { name = _name; return *this; }

  cPart& wypisz()
    {
      cout << " att:" << attack << endl;
      cout << " def:" << defense << endl;
      cout << "  hp:" << hp << endl;
      cout << "name:" << name << endl << endl;
    }
};

int main()
{
  cPart a;
  a.wypisz();

  a.setAttack(55);
  a.wypisz();

  a.setName("krwq").setAttack(23).wypisz();

  return 0;
}

░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-09-29 15:09

Pozostało 580 znaków

2011-09-29 15:46
0

Tylko mój problem nie polega na tym, że nie umię stworzyć funkcji typu cPart.Set_Attack( int _attack); defense,hp,name itd. i ręcznego nadania wartości tylko raczej o użycie 30(możliwe, że więcej w przyszłości) predefiniowanych ustawień danego obiektu. Sądzicie, że dobrym rozwiązaniem byłoby stworzenie funkcji nadaj(int ID)?

class cPart
{
public:
   int attack,defense,hp,organ,element;
std::string name;

cPart()
{
attack=0;
defense=0;
hp=0;
name='';
}
nadaj (int ID)
{
switch(ID)
{
case 1: 
 {
  attack=10;
  defense=2;
  hp=100;
name='asd';
 }
case 2: 
 {
  attack=20;
  defense=12;
  hp=12434;
  name=''dsasd;
 }
//....
case 30:

 {
  attack=12320;
  defense=15435;
  hp=12434;
  name='dddadasdasd';

}
};

Dodatkowo myślałem nad wklepaniem 30 const int których mógłbym używać jako tego ID. (żeby się nie pogubić ^^)

Pozostało 580 znaków

2011-09-29 16:07
Rev
1
#include <string>
#include <map>

class Postac
{
private:
    int atak;
    int obrona;
    int zycie;
    std::string imie;
protected:
    Postac(int atak, int obrona, int zycie) : atak(atak), obrona(obrona), zycie(zycie) { }
    Postac(Postac& postac) : atak(postac.atak), obrona(postac.obrona), zycie(postac.zycie) { }
public:
    static Postac* Nowy(int atak, int obrona, int zycie)
    {
        return new Postac(atak, obrona, zycie);
    }

    Postac* Stworz(std::string imie)
    {
        Postac* nowa = new Postac(*this);
        nowa->imie = imie;

        return nowa;
    }
};

std::map<std::string, Postac*> mapa;

int main()
{
    mapa["ogr"] = Postac::Nowy(5, 4, 20);
    mapa["czlowiek"] = Postac::Nowy(2, 2, 10);

    Postac* miecio = mapa["czlowiek"]->Stworz("miecio");
    Postac* stefan = mapa["ogr"]->Stworz("stefan");

    return 0;
}

Można jeszcze dopracować ten kod: ogarnąć wirtualność, co by np. bez problemu można było dodać klasy pochodne, czy konstruktory zrobić publiczne, to już kwestia co ci lepiej pasuje do koncepcji. W mapie siedzą tzw. prototypy.


No popatrz, napisałeś to w pierwszym poście, a kolega ładnie poczekaj, udał że nie umie z google korzystać i dostał gotowca ;) - stfu 2011-09-29 20:11

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0