Klasy - wydobycie private

0

Hej wszystkim,
na wstępie chciałbym zaznaczyć ,że rozwiązanie być może pojawiło się już gdzieś ale ja po prostu nie mogę tego znaleźć gdyż... nie bardzo wiem jak mam to wpisać w google. Dlatego przydatne będzie nawet jeżeli ktoś powie jak to ugryźć, i gdzie znajdę pomoc ;)

Więc w osobnym pliku, stworzyłem klasę, która w funkcji private ma zadeklarowaną listę dwukierunkową (docelowo jest to baza danych). Przykładowo wygląda to tak :

private :
klasa *przed;
string dana_1;
string dana_2;
string dana_3;
string dana_4;
klasa *za;

W public mam już napisane funkcje typu sortowanie, wyszukiwanie, usuwanie itd i wszystko ładnie działa (w konsoli).

Aktualnie chcę zrobić interfejs graficzny (robię wszystko w VS2012).

Mój problem polega na tym ,iż nie mam zielonego pojęcia jak wyświetlić owe dane w okienku. Robiąc to w konsoli w 'public' miałem po prostu funkcję z pętlą , coutem, i było ok (sama klasa była deklarowana dynamicznie w programie).

Z moich przemyśleń wynika ,że najlepszym rozwiązaniem byłoby napisanie funkcji, która zwracałaby elementy private. Ale... jak? Przede wszystkim czy da się zrobić jedną funkcję ,która zwracałaby 4 elementy jednocześnie? (dana_1, dana_2, dana_3, dana_4) ?

Z góry dziękuję za wszystkie podpowiedzi ;)

0

Jesli sa tego samego typu to mozesz sobie zwrocic te dane w kontenerze przeciez. Podstawowe settery/gettery od tego sa. Podstawy obiektowego pisania i hermetyzmu.

string getData()const { return x; }

2

Najlepiej wyciągać po jednej danej.

Ale w tym wypadku możesz też skorzystać z indeksowania danych, bo wszystkie mają ten sam typ:

Rozwiązanie 1 - operator []:

const string &klasa::operator[](int idx) const
{
  switch(idx) {
    case 1: return dana_1; break;
    case 2: return dana_2; break;
    case 3: return dana_3; break;
    case 4: return dana_4; break;
    default:
      throw runtime_error("Niewłaściwy ID danej!");
  }
}

string &klasa::operator[](int idx) 
{
  switch(idx) {
    case 1: return dana_1; break;
    case 2: return dana_2; break;
    case 3: return dana_3; break;
    case 4: return dana_4; break;
    default:
      throw runtime_error("Niewłaściwy ID danej!");
  }
}

użycie:
klasa k;
k[1] = "test";
cout << "Wynik: " << k[1] << endl;

Rozwiązanie 2 - zwykła funkcja zwracająca:

string klasa::getData(int idx) {
// to samo co wyżej
}

void klasa::setData(int idx, const string &value)
{
// ustawienie dana_x w zależności od idx
}

// Użycie:

klasa k;
k.setData(1, "test");
cout << "Wynik: " << k.getData(1) << endl;

Rozwiązanie 3 - enum:

enum IdDanej { Nr1, Nr2, Nr3, Nr4 };

string klasa::getData(IdDanej id) 
{
  switch(id) {
    case Nr1: return dana_1; break;
    case Nr2: return dana_2; break;
    case Nr3: return dana_3; break;
    case Nr4: return dana_4; break;
    default:
      throw runtime_error("Niewłaściwy ID danej!");
  }
}

Rozwiązanie 4 - std::vector:

class klasa {
//...
  klasa(): m_dane(4) {  }

  string getData(int idx) { 
    return m_dane[idx]; 
  }

  void setData(int idx, const string &value) {
   m_dane[idx] = value;
  }
 private :
           klasa *przed;
           std::vector<string> m_dane;
           klasa *za;
};

// użycie:

klasa k;
k.setData(0, "test"); // tu pierwszy element ma indeks 0
cout << "Wynik: " << k.getData(0) << endl;

0

Ok fajnie dzięki ;)
Wszystko działa super ;D

0
void klasa::getall(string &d1,string &d2,string &d3,string &d4)
  {
   d1=dana_1;
   d2=dana_2;
   d3=dana_3;
   d4=dana_4;
  }

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