Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 23:34

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Konstruktor bei strings als char pointer

Discussion on Konstruktor bei strings als char pointer within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Konstruktor bei strings als char pointer

hey,
Wie sollten die konstruktoren bei char arrays aussehen (idealfall)
z.b man hat die klasse

Code:
class st{ //klasse für strings
	char* satz;
 	int laenge;
public:
 	st(){ 
 		satz = NULL;
 		laenge=0;
	}
	//init konstruktor lieber so
 	st(char* satz){
 		laenge=strlen(satz);
 		this->satz = new char[laenge+1];
 		
 		for(int i=0;i<=laenge;i++){
 			this->satz[i]=satz[i];
		 }
	 }
	 //oder lieber so
	st(char* satz){
 		laenge=strlen(satz);
 		this->satz = satz;
	}
	
	st(const st &str2){
		laenge=str2.laenge;
 		satz = new char[laenge+1];
 		
 		for(int i=0;i<=laenge;i++){
 			satz[i]=str2.satz[i];
		 }
	}

};

wäre das der Idealfall oder sollte iwas anders aussehen? und welcher der initialisierungs- Konstruktoren ist besser?
Slade100 is offline  
Old 11/12/2015, 08:29   #2
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Wenn man den Satz als String ausgeben soll, wieso nicht gleich std::string verwenden? Oder sollte man ein char-array übergeben und das wird in ein std::string umgewandelt und eben als ein String zurückgegeben?

Den zweiten Satz verstehe ich leider auch nicht ganz.

Und mal kurz was mir ins Auge gefallen ist:
Du erstellst ein neues char Objekt, du solltest diesen dynamisch allokierten Speicher wieder freigeben, also im Destruktor wieder freigeben, damit man keine Memory-Leaks hat. (Zwar für kleine Aufgaben unrillevant, aber trotzdem)
XxharCs is offline  
Thanks
1 User
Old 11/12/2015, 09:00   #3
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Mach es nicht so. Guck dir Vectoren an, auch die Stringklasse nutzt einen Char Vektor.

Aber beim ausgeben an die 0 terminierung denken.
Terrat is offline  
Thanks
1 User
Old 11/12/2015, 11:46   #4
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
danke erstmal für die antworten, also das ich das so mache liegt daran, dass das so gemacht werden soll,^^ die einzige funktion die von der stringklasse genutzt werden darf ist strlen
Slade100 is offline  
Old 11/14/2015, 01:57   #5
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Sollte funktionieren habe es in der Bahn am Handy geschrieben. Kann sein das vllt. 1 Befehl oder so falsch geschrieben ist sollte aber eig. funken. ^^ und bin eher ein Englisch Kommentator, also net wundern Operanten wie + = != usw. kannste halt noch hinzufügen.
Code:
#include <stdio.h>
#include <vector>
class ST { // String
protected:
	std::vector <char> VString;
	void Init();
public:
	ST();
	ST(char * String);
	ST(const char * String);
	void append(char * String);
	const char * c_str();
	size_t size();
};
void ST::Init()
{
	VString.push_back('\0');//Add 0
}
ST::ST()
{
	Init();
}
ST::ST(char * String)
{
	Init();
	append(String);
}
ST::ST(const char * String)
{
	Init();
	append(_strdup(String));
}
void ST::append(char * String)
{
	// Requires that String is 00 terminated, otherwise you cant detect the end of a string
	VString.pop_back();//Remove 0
	for (int i = 0; i < strlen(String); i++)
	{
		VString.push_back(String[i]);
	}
	VString.push_back('\0');//Add 0
}
const char * ST::c_str()
{
	return VString.data();
}
size_t ST::size()
{
	return VString.size() - 1; // -1 = removing size of the 0
}
int main()
{
	char * STT = "This";
	ST string(STT);
	string.append(" is a");
	string.append(" Stringtest!");

	printf("Length:%i\n", string.size());
	printf("String:%s\n", string.c_str());

	getchar();
	return 0;
}
Terrat is offline  
Thanks
1 User
Old 11/14/2015, 13:58   #6
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
danke dir sehr für die hilfe und den aufwand durch dein programm seh ich wie man mit den vectoren arbeitet, aber leider bringt mir das für diese aufgabe nicht viel, da die datentypen die ich oben benutzt habe schon feststehen also char* für den string und int für die länge, aber ich hab mittlerweile verstanden, was bei der aufgabe von mir verlangt wird

dennoch würde ich gerne wissen welchen init konstruktor ihr bevorzugt, von denen die ich angegeben habe.
Slade100 is offline  
Old 11/14/2015, 14:18   #7


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,104
Received Thanks: 681
Ich nehme an, dass der im Code nicht-existente Destruktor das Buffer (satz) freigibt. Dies wird problematisch, wenn das Buffer gar nicht allokiert wurde, sondern nur ein Pointer in den Bereich der globalen Variablen ist. Das heißt, dass du im (const) char* Konstruktor entweder eine Kopie machen musst, so dass das Buffer dann wieder auf einen selbstallokierten Speicherblock zeigt, oder du keine Kopie erstellst und im Destruktor dann; wie auch immer; herausfindest, ob das Buffer auf einen heapallokierten Block oder in den Bereich der globalen Variablen zeigt und nur im ersten Fall freigegeben wird. Bei letzterer Methode wirste um systemspezifische Methoden, um halt herauszufinden, ob das Buffer nun freigegeben werden darf oder nicht, nicht herumkommen, denke ich, weswegen ich ersteres empfehlen würde.
Mit ersterer Methode ist es auch legitim, wenn der Konstruktor einen const char* als Übergabetyp bekommt, weil die Inhalte, auf die der Pointer zeigt von deinem Konstruktor dann ja nicht mittelbar oder unmittelbar verändert werden. Zudem wird dann auch
Code:
st mystring("Teststring");
möglich, was ohne const nicht ginge, da diese Literale konstante (!) char-Arrays sind.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Konstruktor Frage
05/14/2015 - Web Development - 4 Replies
Hallo, Ich habe hier ein folgendes Programm (OOP) indem ein Konstruktor ist , nun ist meine Frage: Ich versteh nicht wie es den Namen des Fahrzeugs anzeigt(Ausgabe auf dem Bildschirm). Es wird durch den Code $this->bezeichnung angezeigt aber ich habe dieses neue Fahrzeug ja nicht als bezeichnung "makiert/angegeben" ich meine es so z.B $vespa = bezeichnung (z.B) Hier der Code:
char array vom pointer mit srcpy changen
04/09/2015 - C/C++ - 10 Replies
Hey zusammen, also habe ein kleines problem das grad unnormal nervt:rtfm: Habe in einem game ein pointer der auf ein char array zeigt der pointer ist DWORD* F = (DWORD*)0x0076BBD8; // hier der pointer auf dem pointer ist jetzt ein char array drauf, nehmen wir einfach als beispiel "hey"
C++ default Konstruktor - private Variablen setzen?
12/08/2014 - C/C++ - 1 Replies
#Edit, okay nach einigem rumprobieren, hab ichs jetzt doch hinbekommen :) Hat sich also erledigt.
Wie findet man den Pointer von Strings in CE?
09/24/2012 - General Coding - 1 Replies
Hiho, Ich habe von einem Spiel die HP Werte als String gefunden. Da es aber im dynamischen Speicher ist liegt bei jeden Spielneustart die Adresse anders. Den String brauche ich nur zum lesen, nicht zum schrieben. In C# will ich den String auslesen (Was auch wunderbar klappt). Wie bekomme ich den Pointer von einem string? Ich habe bereits gegoogelt aber nicht gefunden.
[C++]Konstruktor Problem
07/29/2011 - C/C++ - 7 Replies
Hallo , ich habe ein Problem bzw eher gesagt eine Frage zu meinem Code. Ich habe mir eine schnuckelige Klasse angelegt die wie folgt aussieht: class Krieger { private:



All times are GMT +2. The time now is 23:34.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.