Nadawanie wartośći pól obiektu

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. :)

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.

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;
}
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;
}
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ć ^^)

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.

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