|
|
|
|
Doch, als private Funktion. Genau so, wie ich es oben aus der Header Datei gepostet hab.
|
|
|
|
|
|
|
bzw. hat DEIN struct dort kein template
|
|
|
|
|
|
|
…und sofern sich da nix entscheidendes geändert hat kann man template-funktionen eh nicht in einer separaten .cpp packen, sondern nur in den header…
|
|
|
|
|
|
|
der komplette header:
|
Code: |
template <class T>
class List
{
private:
struct Element{
Element* previous;
Element* next;
T* content;
};
Element* head;
Element* tail;
Element* newElement(T* content);
public:
List(void);
~List(void);
void push(T* content);
Element* pop();
bool isEmpty();
int length();
Element* getHead();
Element* getTail();
Element* get(int i);
bool erase(int i);
bool replace(Element* content, int i);
};
|
|
|
|
|
|
|
|
|
struct Element{
Element* previous;
Element* next;
T* content;
};
Element* newElement(T* content);
newElement liegt doch eindeutig _außerhalb_ von struct Element.
|
|
|
|
|
|
|
Ah ok. Jetzt wird das ganze verständlicher
|
|
|
|
|
|
|
|
|
|
|
Ich ziehe Benutzer aus einem Soap-Service.
Nun habe ich leider Zusatzdaten in einer projektspezifischen DB, da ich hier niemanden bewegen kann gewisse Dinge zu standardisieren.
Wenn ich jetzt die Zusatzdaten pro Benutzerobjekt ziehe, kriege ich mal ganz fix 400-600 (Lazy Loading sei dank) SQL-Statements zusammen.
Beispiel wäre eine Auflistung der Benutzer (SOAP) und welcher Klinik sie angehören (DB).
Mit leben oder einen Query abfeuern und den Array mit den Objekten mergen oder Firma wechseln?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Gore am 27.05.2013 13:21]
|
|
|
|
|
|
Sind die Ladezeiten mit realsitischen Datenmengen ein Problem? Falls ja, tu was dagegen. Falls nicht, schreib nen Kommentar an den Code das das ggf. bei Performanceproblemen gefixt werden muss und lass es so.
|
|
|
|
|
|
|
| Zitat von Renga
|
Code: |
template <class T>
Element* List<T>::newElement(T* content){
Element* element = new element;
element->next = null;
element->previous = null;
element->content = content;
return element;
}
|
|
| | Also erst einmal musst du, wenn überhaupt, Element* element = new Element; schreiben. Ich glaube aber, dass es mit Element* element; getan ist.
Außerdem kann da so einiges nicht funktionieren, weil du das Struct unter private hast, aber einige Public-Funktionen einen Pointer auf ein Element-Struct zurückgeben sollen.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von cms am 27.05.2013 15:09]
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
Sind die Ladezeiten mit realsitischen Datenmengen ein Problem? Falls ja, tu was dagegen. Falls nicht, schreib nen Kommentar an den Code das das ggf. bei Performanceproblemen gefixt werden muss und lass es so.
| |
Etwa 1,5 Sek, ist allerdings eine interne Verwaltungssoftware für andere Projekte.
|
|
|
|
|
|
|
cms:
Das geht schon, allerdings können die entsprechenden Funktionen nur aus Bereichen aufgerufen werden, die auf die privaten Elemente Zugriff haben.
|
Code: |
class test
{
private:
struct private_struct
{
int x;
};
public:
private_struct *get_private_struct()
{
return new private_struct();
}
friend void can_call_dat_thing(test *t);
};
void cannot_call_dat_thing(test *t)
{
test::private_struct *ps = t->get_private_struct();
}
void can_call_dat_thing(test *t)
{
test::private_struct *ps = t->get_private_struct();
delete ps;
}
int main()
{
test t;
cannot_call_dat_thing(&t);
can_call_dat_thing(&t);
} |
|
Resultiert dann in
|
Code: |
~ g++ priv.cc
priv.cc: In function ‘void cannot_call_dat_thing(test*)’:
priv.cc:5:12: error: ‘struct test::private_struct’ is private
struct private_struct
^
priv.cc:21:11: error: within this context
test::private_struct *ps = t->get_private_struct();
^
zsh: exit 1 g++ priv.cc |
|
Das Verhalten ist hier allerdings mit hoher Wahrscheinlichkeit nicht gewünscht, vermute ich mal.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 27.05.2013 15:04]
|
|
|
|
|
|
@Gore: Strg + a, Entf, Return und dann die Firma wechseln. :P
@rats: ja, wenn.
|
|
|
|
|
|
|
Ich muss mich gerade mal am Kopf kratzen… die Konstruktion ergibt so aber noch keinen Sinn,
der Friend sähe die Methode auch, wenn sie private wäre.
Hmm, vermutlich ergibt diese Art von Zugriffsrechteüberlagerung nur im Zusammenspiel mit protected und Vererbung schlüssige Anwendungsfälle.
C++ ist schon eine feine Sprache
|
|
|
|
|
|
|
So, Renga, nachdem ich das Problem etwas genauer ausgeleuchtet habe komme ich zu folgenden Ergebnissen:
|
Code: |
#pragma once
template <class T>
class List
{
public:
struct Element
{
T* content;
Element* previous;
Element* next;
Element() : previous(nullptr), next(nullptr), content(nullptr) {}
~Element()
{
if (previous) delete previous;
if (next) delete next;
if (content) delete content;
}
};
List() : head(nullptr), tail(nullptr) {}
~List();
void push(T* content);
Element* pop();
bool isEmpty();
int length();
Element* getHead();
Element* getTail();
Element* get(int i);
bool erase(int i);
bool replace(Element* content, int i);
private:
Element* head;
Element* tail;
Element* newElement(T* content);
};
template <class T>
List<T>::~List()
{
if (head) delete head;
if (tail) delete tail;
};
template <class T>
typename List<T>::Element* List<T>::newElement(T* content)
{
Element* element = new Element;
element->content = content;
return element;
};
// ... |
|
PS: nullptr ist C++11-spezifisch. Wenn dein Compiler das noch nicht unterstützt, dann tut es eine stumpfe 0 auch.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von cms am 27.05.2013 18:53]
|
|
|
|
|
|
Ach toll bis Freitag muss ich ja noch Steuererklärung machen... mhhh -_-
|
|
|
|
|
|
|
Sind sie so streng bei dir?
|
|
|
|
|
|
|
Ich muss zumindest prüfen, ob ich unter die Frist falle bis zur Frist?
|
|
|
|
|
|
|
Danke erstmal cms, muss mir das in Ruhe angucken.
|
|
|
|
|
|
|
Ich glaube Typebounds mit Covariance/Contravariance etc. bei Java muss ich mir in meine Spickzettel-Datei schreiben
|
|
|
|
|
|
|
|
|
|
|
Findet man in java.util.Collections ganz oft, sieht so aus:
|
Code: |
static <T> int binarySearch(List<? extends Comparable< ? super T > > list, T key)
|
|
List<? extends Comparable< ? super T > >
Das sagt halt letztendlich nur "Liste mit einem Datentypen, der irgendwann mal von Comparable geerbt hat". Weil <T extends Comparable> nicht Klassen erfasst, die von einer Klasse erben die von Comparable erben. Warum auch immer.
So ganz 100 prozentig habe ich das auch noch nicht kapiert, kommt mir persönlich aber wieder ein wenig nach einem Um-Schwächen-Herum-Sprachhack vor, der einem am häufigsten wohl begegnen dürfte, wenn man selber irgendwelche Containerartigen Gebilde implementiert.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 27.05.2013 20:31]
|
|
|
|
|
|
Hast du heute eigentlich Geburtstag, Kamel?
|
|
|
|
|
|
|
|
|
|
|
Habe ich heute Morgen auch überlegt
|
|
|
|
|
|
|
Wofür haben wir denn die Liste?!
|
|
|
|
|
|
|
| Zitat von csde_rats
Findet man in java.util.Collections ganz oft, sieht so aus:
|
Code: |
static <T> int binarySearch(List<? extends Comparable< ? super T > > list, T key)
|
|
List<? extends Comparable< ? super T > >
Das sagt halt letztendlich nur "Liste mit einem Datentypen, der irgendwann mal von Comparable geerbt hat". Weil <T extends Comparable> nicht Klassen erfasst, die von einer Klasse erben die von Comparable erben. Warum auch immer. Quatsch***
So ganz 100 prozentig habe ich das auch noch nicht kapiert, kommt mir persönlich aber wieder ein wenig nach einem Um-Schwächen-Herum-Sprachhack vor, der einem am häufigsten wohl begegnen dürfte, wenn man selber irgendwelche Containerartigen Gebilde implementiert.
| | Das sagt: "Eine Liste mit einem beliebigen Datentypen*, der von Comparable erbt. Allerdings nur Typen, die vom Typ oder einem Supertyp von T sind**, damit man es mit dem key (der vom Typ T ist) vergleichen kann."
* Ist ja für den Algorithmus vollkommen egal, hauptsache vergleichbar.
*** <T extends Comparable> heißt, dass du einen bestimmten Datentyp T hast, der von Comparable erbt. Aber das ist für den Algorithmus nicht zweckdienlich. Man bekommt eine Liste mit irgendwelchen Daten darin. Und man will den Key vom Typ T finden. Es kann aber sein, dass in der Liste Daten von einem anderen Typ als T sind. Das ist auch Ok, diese Daten müssen einfach nur mit dem Key vergleichbar sein. Das ist alles.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von cms am 27.05.2013 22:35]
|
|
|
|
|
|
| Zitat von Noch_ein_Kamel
Ich muss zumindest prüfen, ob ich unter die Frist falle bis zur Frist?
| |
Du gehst also davon aus, dass sie dir direkt eine Geldbuße aufs Auge drücken, solltest du die mögliche Frist verpassen?
|
|
|
|
|
|
|
|
|
|
|
| Zitat von Smoking
| Zitat von Noch_ein_Kamel
Ich muss zumindest prüfen, ob ich unter die Frist falle bis zur Frist?
| |
Du gehst also davon aus, dass sie dir direkt eine Geldbuße aufs Auge drücken, solltest du die mögliche Frist verpassen?
| | nein... ich geh davon aus dass die frist abläuft und ich kein bock habe mich die 2 stunden hinzusetzen für 3,50¤
|
|
|
|
|
|
Thema: Gehirnsalat ( wir unter uns ) |