Klassen nach Wert festlegen und übergeben?[Duplikat]
Frage
Mögliches Duplikat:
Was ist die Dreierregel?
Der folgende Code gibt bestenfalls Müll aus oder stürzt ab:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
class C {
public:
char* s;
C(char* s_) {
s=(char *)calloc(strlen(s_)+1,1);
strcpy(s,s_);
};
~C() {
free(s);
};
};
void func(C c) {};
void main() {
C o="hello";
printf("hello: %s\n",o.s); // works ok
func(o);
printf("hello: %s\n",o.s); // outputs garbage
};
Ich frage mich wirklich, warum – das Objekt sollte nicht einmal berührt werden, weil ich es als Wert übergebe ...
Lösung
Alles an Ihrem Code ist in den Augen von C++ schlecht, sorry.Versuche dies
#include <iostream>
class C {
std::string s;
C(const std::string& s_)
: s(s_){}
};
std::ostream& operator<<(std::ostream& os, const C& c){
return os << c.s;
}
void func(C& c){
// do what you need here
}
int main(){
C c("hello");
std::cout << c << '\n';
func(c);
std::cout << c << std::endl;
return 0;
}
In diesem Beispiel müssen Sie sich keine Gedanken über die Speicherzuweisung und -zerstörung, Printf-Formatzeichenfolgen oder strcpy machen.Es ist viel robuster.
C mit Klassen (was Sie schreiben) ist kategorisch falsch und ignoriert blind die Funktionen, die erstellt wurden, um die Sprache ohne Mehraufwand sicherer und einfacher zu machen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow