"struct etc " fehler bei visual Studio was bei g++ durch gieng
-
Du kannst in einer Klasse keine Instanz ihrer selbst haben. Wie sollte das gehen? Und was soll das bringen?
-
Du solltest wirklich an deiner Rechtschreibung feilen, nachher liest das noch jemand!
-
SeppJ schrieb:
Du kannst in einer Klasse keine Instanz ihrer selbst haben. Wie sollte das gehen? Und was soll das bringen?
Es sol ja nur eine iste von Kindern sein; das wird woh ein Baum.
Das füht sich mit std::queue natürich nicht so gut an wie mit std::list.
(Manche Buchstaben eingespart als Ausgeich für BigGreenFoots Mehrausgaben).
-
volkard schrieb:
SeppJ schrieb:
Du kannst in einer Klasse keine Instanz ihrer selbst haben. Wie sollte das gehen? Und was soll das bringen?
Es sol ja nur eine iste von Kindern sein; das wird woh ein Baum.
Das füht sich mit std::queue natürich nicht so gut an wie mit std::list.
(Manche Buchstaben eingespart als Ausgeich für BigGreenFoots Mehrausgaben).Trotzdem bleibt das der Grund des Fehlers. Deine Kinder sind kein Teil von dir, du kennst sie bloß und weißt (wenn du Glück hast
) wo sie gerade sind.
-
SeppJ schrieb:
volkard schrieb:
SeppJ schrieb:
Du kannst in einer Klasse keine Instanz ihrer selbst haben. Wie sollte das gehen? Und was soll das bringen?
Es sol ja nur eine iste von Kindern sein; das wird woh ein Baum.
Das füht sich mit std::queue natürich nicht so gut an wie mit std::list.
(Manche Buchstaben eingespart als Ausgeich für BigGreenFoots Mehrausgaben).Trotzdem bleibt das der Grund des Fehlers. Deine Kinder sind kein Teil von dir, du kennst sie bloß und weißt (wenn du Glück hast
) wo sie gerade sind.Das ist eine Frage des Standpunktes; eine Node-Klasse kann sich darauf beschränken, auf alle Zweige zu verweisen - man kann sie auch als ganzen Baum betrachten, die dann gleichzeitig alle Unterbäume enthält.
Jedenfalls ist das Problem des OP prinzipieller Natur (und der Code ist nicht standardkonform).
Formal deshalb, weil das Templateargument jump_ellement in der Definitionstd::deque<jump_ellement> includet_blocks;unvollständig ist (17.4.3.6/2 letzte Alternative).
Im Allgemeinen benötigen Container Informationen über den vollständigen Typ des Elementes, um die geeignete Speicherstrategie bestimmen zu können, im Falle von Standardcontainern geschieht das durch den Allokator.
Abgesehen von der Möglichkeit, etwas Handgeschriebenes zu verwenden (wovon i.d.R. abzuraten ist), ist Indirektion ein geeignetes Mittel.
Also entweder ein Container, der (Smart-)pointer verwaltet (Zeiger sind immer vollständig definiert, selbst wenn es der Typ, auf den gezeigt wird, nicht ist). Oder es wird ein Zeiger auf einen Container verwendet (das dürfte die einfachere Variante sein).
-
Das bedeutet ich muss eine Deque voller Zeiger machen. Ok aber wie geht dann das:
#include <iostream> #include <deque> struct blabla { std::deque<blabla *> de; int blub; } int main() { blabla ins; ins.de.push_back(new blabla); std::deque<blabla *>::iterator arrow; //ab hier hab ich keinen Plan wie der Zugriff aussehen soll. //ich muss arrow referenzieren, und das, auf das arrow zeigt is ja auch wieder eine //Referenz, ich dachte der Zugrif würde so funktionieren: (*arrow)->blub=5; //das geht zwar durch den Compiler, aber beim ausführen wird das Programm mit dem //Signal SIGSEGV (Linux) beendet. }
-
Dein Iterator muss auch auf ein Element aus ins verweisen.
-
camper schrieb:
Jedenfalls ist das Problem des OP prinzipieller Natur (und der Code ist nicht standardkonform).
Formal deshalb, weil das Templateargument jump_ellement in der Definitionstd::deque<jump_ellement> includet_blocks;unvollständig ist (17.4.3.6/2 letzte Alternative).
Ganz klar ist mir der Satz nicht.
17.4.3.6/2 letzte Alternative:
In particular, the effects are undefined in the following cases:
if an incomplete type (3.9) is used as a template argument when instantiating a template component.Geht oder gehtnicht?
#include <iostream> #include <queue> using namespace std; template<typename Pointee> struct Pointer{ Pointee* pointee; }; struct Ellement{ double data; Pointer<Ellement> next; }; struct List{ Pointer<Ellement> anchor; List(){ anchor.pointee=0; } void push(double d){ Ellement* newEllement=new Ellement; newEllement->next.pointee=anchor.pointee; anchor.pointee=newEllement; } }; int main(){ List list; list.push(4711); }
-
volkard schrieb:
Geht oder gehtnicht?
Geht. Dein Template Pointer gehört ja nicht zur Standardbibliothek.
-
@BigGreenFoot:
Nur mal ne Frage am Rande: ist dir klar dass Deque-Iteratoren nicht "stable" sind? Anders gesagt: die werden ungültig, sobald du an der Deque was änderst (was einfügst oder löscht).