Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++ diverses...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.03.2004, 19:39 Uhr
kronos
Quotenfisch
(Operator)


hi!
habe ein paar fragen in sachen C++:

1. ist es normal, dass der compiler nicht merkt wenn ich in der methode einer klasse ein symbol verwende, dass es gar nicht gibt? er könnte doch feststellen ob es global, in der klasse oder in der methode selbst definiert ist?

2. ich habe eine klasse A. diese enthält einen int X und einen array/vektor mit mehreren klassen B. jede klasse B sollte nun auf X zugreifen können. also, nicht vererbt sondern das selbe X, wenn klasse a den X ändert, soll B das mitbekommen. wie lässt sich das am besten realisieren? kann man irgendwie referenzen vererben oder so? (B kann, muss aber keine ableitung von A sein)

3. ich möchte zeichenfolgen datenbank-artig speichern. würdet ihr einen std::string-vektor oder einen char*-vektor verwenden? wenn ich frisst string in diesem fall deutlich mehr resourcen?

4. eine frage zum stil: sollte ich C/C++ strikt trennen, oder verwendet man auch in C++-projekten libc-funktionen? ich finde z.b. printf oft einfach praktischer als std::cout gemurkse...

to be continued...
vielen dank für antworten!!!
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 23.03.2004 um 19:39 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2004, 20:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


1. kommt auf die einstellung deines compilers an
2. z.b


C++:
class A;

class B {
public:
  B() {};
  B(A *pa) { pA = pa; };
  ~B() {};
  A *pA;
};

class A {
public:
  A() {};
  ~A() {};
  std::vector<B> arrB;
};

int main(void)
{
  A myA;
  B myB(&myA);
  myA.arrB.insert(myA.arrB.begin(),myB);
}



ungetestet, (könnte/)sollte funktionieren

3. ka ausprobieren?

4. mach ich auch nicht immer, gibts überhaupt einen c++-sprintf-ersatz?!?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.03.2004, 09:45 Uhr
stephanw
localhorst


Zu 4.) Kannst Du häufig nicht trennen bzw. ist es (meiner bescheidenen Meinung nach) nicht sinnvoll. Z.B. so sinnvolle Funktionen wie atoi() oder so benutze ich auch. Die ganzen Standard-C-Funktionen aus der math.h bzw. cmath wie sin/cos/sqrt/... sind weitere Beispiele. Allerdings sollte man das nicht zu weit treiben und nach Möglichkeit innerhalb von Methoden lassen und nicht C-typische Konstrukte über eine Schnittstelle nach außen tragen. Dazu gehören z.B. intensive void* Benutzung oder "altmodische" Fehlerbehandlung mittels Rückgabewert o.ä., dafür gibts in C++ meistens bessere Lösungen.

Zu printf: der Einfachheit halber benutze ich das auch hin und wieder (ob das gut ist oder nicht kA), aber es gibt auch eine C++ -Lösung in der Boost-Bibliothek (--> www.boost.org/libs/format/index.html).

Auch eine Mischung von C++-new/delete und C-malloc/free sollte man vermeiden. Klappt 1000 mal gut, hab aber auch schon ein Programm debugged, bei dem diese Mischung zum regelmäßigen unerklärlichen Absturz führte. Ist sicher implementierungsabhängig.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.03.2004, 10:57 Uhr
ao

(Operator)



Zitat:
kronos postete
1. ist es normal, dass der compiler nicht merkt wenn ich in der methode einer klasse ein symbol verwende, dass es gar nicht gibt? er könnte doch feststellen ob es global, in der klasse oder in der methode selbst definiert ist?

Symbole, die es nicht gibt, führen immer zu einem "undefined symbol"-Compilerfehler. Wenn du meinst, ein Gegenbeispiel zu haben, dann zeig mal den Code.


Zitat:
2. ich habe eine klasse A. diese enthält einen int X und einen array/vektor mit mehreren klassen B. jede klasse B sollte nun auf X zugreifen können. also, nicht vererbt sondern das selbe X, wenn klasse a den X ändert, soll B das mitbekommen. wie lässt sich das am besten realisieren? kann man irgendwie referenzen vererben oder so? (B kann, muss aber keine ableitung von A sein)

Ich lass das mit dem B-Vektor in A mal weg und nehme nur ein einzelnes B. Ist einfacher, aber im Prinzip das gleiche. Also etwa so:

C++:
class B
{
    int & m_rnX; // Referenz auf externes X
};

class A
{
    int m_nX;
    B m_bB;
};


Und jetzt soll das m_nB in A das m_nX kennen? Realisieren könnte man das über geeignete Konstruktoren:

C++:
B::B (int & rnX) : m_rnX (rnX) {}  
A::A () : m_bB (m_nX) {}


Aber ich finde, es riecht nach Designfehler. Es ist immer verdächtig, wenn eine Klasse die Innereien der anderen kennen muss. Was soll denn das werden?

Wenn B kein Member von A, sondern von A abgeleitet ist, kennt es automatisch auch die Member von A (außer die privaten). Dann ist das Ganze eh kein Thema.


Zitat:
3. ich möchte zeichenfolgen datenbank-artig speichern. würdet ihr einen std::string-vektor oder einen char*-vektor verwenden? wenn ich frisst string in diesem fall deutlich mehr resourcen?

Ich würde so viel wie möglich fertige Klassen nehmen, einfach weil da die meisten Fehler schon raus sind. Und Zeichenketten-Verwaltung über char*-Arrays ist sehr fehlerträchtig. Um Räder neu zu erfinden, die es schon gibt, braucht man einen sehr guten Grund.

Und die STL-Klassen sind meist gut optimiert, so dass es schwierig sein dürfte, sie bezüglich Resourcenverbrauch zu toppen.

Etwas anderes ist es, wenn du eine String-Klasse schreiben willst, um zu verstehen, wie es geht. Das ist natürlich immer erlaubt.


Zitat:
4. eine frage zum stil: sollte ich C/C++ strikt trennen, oder verwendet man auch in C++-projekten libc-funktionen? ich finde z.b. printf oft einfach praktischer als std::cout gemurkse...

Es spricht nichts dagegen, libc-Funktionen in C++-Quellcode zu verwenden. Vorsicht aber beim Mischen beider Welten. Abwechselndes Verwenden von printf und cout kann überraschende Wirkungen haben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.03.2004, 11:08 Uhr
typecast
aka loddab
(Operator)


Zu
3.) Also ein std::string frisst natürlich mehr Resourcen als ein char*, wenn du für den char* genausoviel Speicher anlegst wie benötigt (wie viel mehr das ist kommt auf die Größe des Strings und auf die jeweilige Implementierung an. Der C++-Compiler von Borland reserviert von Anfang an für jeden String 256 Zeichen, wärend der g++ mit 1 oder 2 zeichen anfängt und dann wenn benötigt den reservierten Speicher verdoppelt). Allerdings darfst du nicht vergessen, dass ein std::string das arbeiten mit strings wesentlich vereinfacht. Ich benutze eigentlich immer den std::string

4.) Das kommt ganz auf deine Vorlieben an. Ich versuche wenn möglich immer reines C++ zu verwenden. Es gibt imho für jede C Funktion ein C++ äquivalent, dass diese Aufgaben übernehmen kann. Als Beispiel kann man z.B. mit der Klasse std::stringstream alles mögliche in einen std::string schreiben. Hier mal ein ungetestetes Beispiel:

C++:
#include <iostream>
#include <string>
#include <sstream>

int main()
{
    std::string testString;
    std::stringstream s;
    s << "foo " << "124" << " bar " << "123.4";
    getline(s, testString);
    std::cout << testString << std::endl;
    return 0;
}


--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.03.2004, 20:44 Uhr
kronos
Quotenfisch
(Operator)


Hallo,
vielen Dank für die Antworten erstmal!!
Komme leider erst jetzt wieder dazu mich d'rum zu kümmern.
Was 1. betrifft, da hatte ich wohl irgendwas durcheinander gebracht, ich kann's zumindest nicht rekonstruieren.

2.:

C++:
Aber ich finde, es riecht nach Designfehler. Es ist immer verdächtig, wenn eine Klasse die Innereien der anderen kennen muss. Was soll denn das werden?

So eine Art Datenbank. Es gibt, wie gesagt, die Klasse A mit einem Vektor voller B-Objekte. Ein B enhält wiederum einen weiteren Vektor mit x Elementen. x kann verändert werden, ist aber für alle Bs gleich. Darum sollten die Bs die Anzahl x kennen, damit sie den vector anpassen können.
Nun hatte ich mir vorgestellt, dass x in A steht und ich B irgendwie cool von A ableite oder so, aber das ist wohl wirklich nicht sehr effektiv, ich werde also dem Konstruktor von B x übergeben, bzw. einer Methode um den vector anzupassen.
(Ist das überhaupt verständlich, was ich hier schreibe??)
Ein weiteres Problem ist, dass ich B per Destruktor aus dem vector in A löschen können möchte.
Falls also jemand einen Vorschlag hat, wie ich das schlauer strukturieren kann, wäre ich sehr dankbar.


zu 3.:
Ok, habe mich nun auch mit der string-klasse angefreundet und möchte sie nicht missen

4.
Alles klar, printf muss ich also nicht vergessen.

Ich habe noch eine neue Frage:
5. Ist es üblich das n-te Element eines vectors so zu löschen:

C++:
std::vector<int> kartoffel;
/* vector füllen */
kartoffel.erase( (std::vector<int>::iterator) &kartoffel[n]);
// bzw.:
kartoffel.erase( kartoffel.begin()+n);



Warum kann ich statt (std::vector<int>::iterator) nicht einfach (int*) schreiben? Wird nicht erstmal das template geparst und dabei die funktion
int *vector::erase(int*);
deklariert?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 30.03.2004 um 20:47 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.03.2004, 09:49 Uhr
ao

(Operator)



Zitat:
kronos postete

C++:
Aber ich finde, es riecht nach Designfehler. Es ist immer verdächtig, wenn eine Klasse die Innereien der anderen kennen muss. Was soll denn das werden?

So eine Art Datenbank. Es gibt, wie gesagt, die Klasse A mit einem Vektor voller B-Objekte. Ein B enhält wiederum einen weiteren Vektor mit x Elementen. x kann verändert werden, ist aber für alle Bs gleich. Darum sollten die Bs die Anzahl x kennen, damit sie den vector anpassen können.
Nun hatte ich mir vorgestellt, dass x in A steht und ich B irgendwie cool von A ableite oder so, aber das ist wohl wirklich nicht sehr effektiv, ich werde also dem Konstruktor von B x übergeben, bzw. einer Methode um den vector anzupassen.

Mit einem Ableitungsverhältnis drückst du aus, dass die B Spezialisierungen von A sind. Ich habe den Eindruck, dass die Wirklichkeit eher ist: "A besitzt oder enthält ein oder mehrere B". Das drückt man durch ein Memberverhältnis aus:

C++:
class A
{
private:
    std::vector<B> m_vB;
};


Wenn der x-Vektor sinngemäß B zugeordnet ist, dann sollte man ihn nicht nach A verlegen. Auch wenn das im ersten Anschein Probleme löst: Du schaffst eine künstliche Abhängigkeit zwischen A und B, die die Sache am Ende wahrscheinlich doch wieder kompliziert macht.

Du kannst x in B lassen und static machen, dadurch verwenden alle Instanzen von B dasselbe x:

C++:
class B
{
private:
    static std::vector<int> m_vX;
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: