Struct Allokieren ?

12/03/2012 13:03 °Jin°#1
Hallo,

Ich arbeite mich gerade durch das Buch C++ A - Z und bin gerade bei den Structuren, so
jetzt habe ich mir als beispiel ein kleines (Telefon Buch) gemacht ganz simpel (Vorname, Nachname, Geschlecht, Nummer)

Code
PHP Code:
#include "stdafx.h"

using namespace std


struct Handy_Buch
{
    
char Vorname[56], Nachname[56]; 
    
bool Geschlecht
    
int  Handynummer
}; 



int _tmain(int argc_TCHARargv[])
{
    
    
Handy_Buch *book = new Handy_Buch();

    
// Neue Person eintragen 

    
strcpy_s(book->Vorname"Test"); 
    
strcpy_s(book->Nachname"Test");
    
book->Handynummer 8888;
    
book->Geschlecht  0

    
// Person ausgeben 

    
cout << "::::Handy-Buch::::\n" << "Vorname: " << book->Vorname << "\nNachname: " << book->Nachname << "\nHandynummer: 0" << book->Handynummer << "\nGeschlecht: "
    if(
book->Geschlecht == 0){
        
cout << "Maennlich" << endl
    }else if(
book->Geschlecht == 1){
        
cout << "Weiblich" << endl
    }else{
        
cout << "/" << endl
    }
    
cout << "..... Ende" << endl

    
getchar(); 
    return 
0;

Jetzt würde ich gerne mehr als 1 Konto speichern ohne arrays zu nutzen ich habe mich schon schlau gemacht im Internet, was ich gefunden habe ist Allokieren doch werde ich nicht 100% schlau raus weil ich ja später vergleichen will und nur bestimmte Kontos aufrufen will, meine frage kann mir vlt jemand helfen mir das Allokieren nähr bringen ?

Edit~

Ich möchte später die Daten in eine Datenbank speichern und wieder laden lassen und wenn ich ein neues Konto hinzufüge prüfe ob es die Nummer schon gibt vorname.
12/03/2012 13:33 nkkk#2
du alloziertst soch schon n der ersten zeile von main mit dem new operator.

wenn du mehere objekte speichern willst, ohne für jedes eine neue variable zu benutzten musst du ein array (b.z.w. list, stack oder ähnliches) benutzten. wenn du die dynamisch allozierst hast du eben ein array von ziegern.

ein array ist im grunde auchnur ein zeiger auf das erste element, natürlcih kannst du auch nur den abspeichern und die positionen selbst ausrechnen aber das macht keinen sinn.

wieso willst du es denn ohne arrays machen?
12/03/2012 13:47 °Jin°#3
Quote:
du alloziertst soch schon n der ersten zeile von main mit dem new operator.

wenn du mehere objekte speichern willst, ohne für jedes eine neue variable zu benutzten musst du ein array (b.z.w. list, stack oder ähnliches) benutzten. wenn du die dynamisch allozierst hast du eben ein array von ziegern.

ein array ist im grunde auchnur ein zeiger auf das erste element, natürlcih kannst du auch nur den abspeichern und die positionen selbst ausrechnen aber das macht keinen sinn.

wieso willst du es denn ohne arrays machen?
Achso achso ..

Ich möchte gerne als Projekt ein kleines Telefon Buch schreiben, der alle Personen in eine Datenbank speichert (diesen teil habe ich schon fertig) beim Start möchte ich gerne alle Personen Informationen in eine Structur speichern.. und einzeld ausgeben lassen bei Arrays in das ja simpel Array[Punkt][Stelle] doch wie mache ich das bei Structuren obj->Vorname (der 3 aus der Datenbank) ?

Edit~

Die Datenbank sieht so aus !
Code:
ID, Vorname, Nachname, Geschlecht, Nummer
12/03/2012 14:09 nkkk#4
naja wie ganau man das macht hängt davon ab welche db zu verwendest, oder ob du OR-mapping verwendest.

für mysql ist hier: [Only registered and activated users can see links. Click Here To Register...] ein post der erklärt wie man daruf zugreift.
allgemein mit arrays man es so
1) Get anzahlzeilen
Code:
Handy_Buch** Liste  = new (Handy_Buch*)[anzahlzeilen];
for i = 1... anzahlzeilen
   Liste[i] = new Handy_Buch();
   Liste[i]->Handynummer  = ...
   ...
der code kann fehlerhaft sein hab lange nciht in c++ gecodet.
aber es gibt klassen list etc die man statt einem array verwenden kann(sollte) weil die einfacher zu benitzten sind.
12/03/2012 15:00 °Jin°#5
Hmm,

Gibt es noch eine andere möglichkeit ?
12/03/2012 16:53 Zwawo#6
Wieso erstellst du denn nicht einfach mehrere Objekte von "Handy_Buch" ?
Oder machst es so:
Code:
Handy_Buch bookarray[100];
bookarray[1].Geschlecht = 1;
bookarray[1].Handynummer = 123;
...
12/03/2012 20:35 °Jin°#7
Hmm,

Oke das geht auch :) doch wenn ich das so machen will Handy_Buch *book[100];
spuckt er mir eine lese Fehler aus, gibt es noch eine möglichkeit im Buch steht nicht leider viel dazu drine.
12/03/2012 22:43 Zwawo#8
Wieso muss es denn unbedingt ein Pointer sein?
12/05/2012 21:11 Master674b#9
Code:
struct SPersonEntry {
	std::wstring FirstName, LastName; // Chinesische, Russische Namen usw ;)
	bool Gender;
	uint32 Phone;
}

class CPhoneBook : public Singleton<CPhoneBook> {
public:
	CPhoneBook() {
		/* Personen laden... */
		SPersonEntry personEntry;
		personEntry.FirstName = L"...";
		// ...
		m_content.insert( personEntry ); }

	inline const std::list<SPersonEntry>& content() const {
		return m_content;
	}

protected:
	std::list<SPersonEntry> m_content;
};
So wäre in etwa meine Lösung ;)

Iteration über die objekte ist mit STL containern auch sehr nice.

hier:

Code:
for( auto person : sPhoneBook.content() ) {
	if( person.FirstName == L"Max" && person.LastName == L"Mustermann" )
		/* Max Mustermann gefunden! */
}
12/06/2012 00:55 Nightblizard#10
std::list ist hier wohl eine relativ schlechte Idee. std::vector ist in 95% der Anwendungsfälle die richtige Wahl.
Oh, und das inline kannst du dir sparen, dein Compiler ignoriert das.
12/06/2012 16:10 Master674b#11
Quote:
Originally Posted by Nightblizard View Post
std::list ist hier wohl eine relativ schlechte Idee. std::vector ist in 95% der Anwendungsfälle die richtige Wahl.
Oh, und das inline kannst du dir sparen, dein Compiler ignoriert das.
Wieso sollte ich den vektor bevorzugen? Ich brauche die liste nicht als fixes array das dauernd einen Speicherwechsel macht ohne reserve.

Falls ich einzigartige Einträge möchte wäre auch ein std::set zu empfehlen.
12/08/2012 20:12 °Jin°#12
Entschuldigung das ich mich erst so spät melde :), Danke für die beispiele ich habe mir mal die Vectors angeschaut doch wenn ich 2x mal die gleiche exe zeitgleich Starte bekomme ich einen Fehler einen Deadlock ^^