Forum: PC-Programmierung Henne <-> Ei Problem!


von Meik J. (tidemic)


Lesenswert?

Frohe Oster, sehr geehrte Community!
Ich schreibe gerade auf dem Arduino ein kleines
Programm. Und möchte über ein Terminal (Putty)
Variablen ändern Funktionen aufrufen durch Verzeichnisse
navigieren.

Damit ich nicht alles in Spaghetti schreiben wollte.

Jetzt zu meinem Problem:
Bspl:

template <typename T, typename P>
class Container
{
 public:
 String Name;//Terminal Name des Wertes
 T Value;//Enthaltener Wert
 P *Pointer;//Soll auf das nächste Container Objekt verweisen ! ;)
};

Und da habe ich jetzt natürlich das Problem:

Container<int,Container < bool,Container <.............

Ich wollte halt von diesem Container auf den nächsten verweisen der 
seiner
Seits ja auch auf einen Verweist usw!


Habe mich ein weinig fest gefranzt.
Kreative neue Denkansätze erwünscht.

Gruß Meik

: Verschoben durch Moderator
von g457 (Gast)


Lesenswert?

..ich sehe zwar keine konkrete Frage aber die Antwort ist trotzdem 
Vererbung und Abstraktion.

HTH

von Max H. (hartl192)


Lesenswert?

Meik Juenke schrieb:
> Und da habe ich jetzt natürlich das Problem:
>
> Container<int,Container < bool,Container <.............
>
> Ich wollte halt von diesem Container auf den nächsten verweisen der
> seiner
> Seits ja auch auf einen Verweist usw!
Und was ist dabei das Problem? Ist eine ganz normale verkettete Liste

von Meik J. (tidemic)


Lesenswert?

Danke für die schnellen Antworten

Also doch Tippen..

Das Problem ist das es verdammt viele verschiedene Typen durch
die Template Kombinationen zustande kommen.
 Halt nicht einfach Vektor und gut.

Eine Template das als Parameter ein Template erhält das seiner seits 
weider
ein Template erhält....

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Kennst du schon std::tuple ?
http://en.cppreference.com/w/cpp/utility/tuple

Da du aber scheinbar einen Container brauchst der viele Variablen 
unterschiedlichen Typs enthält, kann man da nicht viel machen, denn du 
musst ja alle Typen irgendwo angeben...

von Leidensgenosse (Gast)


Lesenswert?

So etwas hab ich in Java gesehen. Listen von Maps von Listen von Listen 
von Maps oder so ähnlich. Bin zu der Meinung gekommen: Am besten den 
Erfinder erschlagen und von Grund auf neu anfangen.

von Vlad T. (vlad_tepesch)


Lesenswert?

1
QMap<QString, QVariant>
2
oder eine beliebige liste.

bzw eine boost variante des ganzen.

Prinzipiell ist es meist eine schlechte Idee, die Containerstructur (bei 
dir Link auf nächstes Element) mit den Daten (bei dir Key-Value-Pair) zu 
vermixen.

Wenn man das ganze unbedingt selber schreiben will, dann eine Klasse, 
die genug speicher für den größsten möglichen Typen enthält (oder wenns 
noch abstracter sein soll, einen void pointer) und ein feld, was den Typ 
speichert.

mittels Template zugriffsfunktionen, die den Typ checken (zb via type 
traits) kannst du dein OBjekt wieder rausholen.
1
template <class T>
2
class MyVariantTypeId{
3
enum { id = -1 };
4
}
5
6
7
template <>
8
class MyVariantTypeId<bool>{
9
  enum { id = 0 };
10
}
11
template <>
12
class MyVariantTypeId<int8>{
13
  enum { id = 1 };
14
}
15
class MyVariant
16
{
17
public:
18
  template <class T> 
19
  bool set( const T& v){
20
    if ( sizeof(T) <= MAX_VAR_BYTES){
21
      m_type= MyVariantTypeId<T>::id;
22
      *((T*)m_data) = v;
23
       return true;
24
    }
25
    return false;
26
  }
27
28
  template <class T> 
29
  const T* get(){
30
    m_data = MyVariantTypeId<T>::id;
31
    if (MyVariantTypeId<T>::id == m_type){
32
       return ((T*)m_data);
33
    }
34
    return nullptr;
35
  }
36
37
private:
38
  int     m_type;
39
  uint8_t m_data[MAX_VAR_BYTES];
40
}


Edit: der Code ist jetzt nur so runtergetippt, um das Prinzip zu 
verdeutlichen. Kann sein, dass er fehler enthält. Sowohl syntaktischer, 
als auch logischer Natur

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Ist soetwas gewünscht?
1
class basic_container {
2
  public:
3
    String Name;//Terminal Name des Wertes
4
    basic_container *Pointer;//Soll auf das nächste Container Objekt verweisen ! ;)
5
};
6
7
template <typename T>
8
class Container : public basic_container {
9
  public:
10
    T Value;//Enthaltener Wert
11
};

von Meik J. (tidemic)


Lesenswert?

Moin,
ihr habt mir sehr weiter geholfen. Ich habe zwar keinen der Vorschläge
direkt umgesetzt. Aber der "Denkanstoß" kam!
Und ich habe mein altes Konzept über den Haufen geschmissen!
An dieser Stelle erstmal danke! :)

Da die Befehle vom Terminal als String weiter verarbeitet werden.
Setze ich Polymorphie ein.
Eine Basis Klasse die virtual Methoden hat und als Parameter String
erwartet.
Und von ihr zB eine Template Klasse ableite.
So kann immer über den gleichen Typ (Basis) Zeiger auf alle relevanten
Methoden der verschiedenen Objekte zugegriffen werden.

So die IDEE! ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.