Vererbungsproblem beim Klassenkonstruktor mit String Uebergabe

Vitus

Mitglied
Moinmoin,

ich habe wieder angefangen zu Programmieren und bin natuerlich prompt auf ein paar Probleme gestossen.

Gegeben sei eine Basisklasse:
Code:
class FSVARIABLE{
private:
  char *name;
public:
  FSVARIABLE(const char* newname = "");
  ~FSVARIABLE(void);
};

Zugehoerige Implementierung:
Code:
FSVARIABLE::FSVARIABLE(const char* newname){
  name = new char[strlen(newname)+1];
  strcpy_s(name, sizeof(name),newname);
};

FSVARIABLE::~FSVARIABLE(void){
  delete[] name;
};

Nun moechte ich von dieser Klasse eine spezifischere Klasse ableiten:
Code:
class VOLTAGE : public FSVARIABLE
{
public:
  VOLTAGE(const char parent_name = "");
};

Nun ergibt sich ein Problem mit der Implementierung des Konstruktors. Ich haette es gerne dass der Name zusammengesetzt wird aus parent_name+" VOLTAGE". Wenn also als parent_name "ESS BUS" uebergeben wird soll der Konstruktor der VOLTAGE Klasse daraus ""ESS BUS VOLTAGE" machen und diesen Wert in der name Variable abspeichern. Wie mache ich das moeglichst elegant?

Gruss
Vitus
 
Hi.
Gegeben sei eine Basisklasse:
Code:
class FSVARIABLE{
private:
  char *name;
public:
  FSVARIABLE(const char* newname = "");
  ~FSVARIABLE(void);
};

Zugehoerige Implementierung:
Code:
FSVARIABLE::FSVARIABLE(const char* newname){
  name = new char[strlen(newname)+1];
  strcpy_s(name, sizeof(name),newname);
};
sizeof(name) ist immer konstant (z.B. 4 oder 8). Du müßtest ebenfallls strlen(name)+1 verwenden.

Und warum willst du unbedingt mit C-Strings hantieren? Warum verwendest du nicht einfach std::string?

Nun moechte ich von dieser Klasse eine spezifischere Klasse ableiten:
Code:
class VOLTAGE : public FSVARIABLE
{
public:
  VOLTAGE(const char* parent_name = "");
};

Nun ergibt sich ein Problem mit der Implementierung des Konstruktors. Ich haette es gerne dass der Name zusammengesetzt wird aus parent_name+" VOLTAGE". Wenn also als parent_name "ESS BUS" uebergeben wird soll der Konstruktor der VOLTAGE Klasse daraus ""ESS BUS VOLTAGE" machen und diesen Wert in der name Variable abspeichern. Wie mache ich das moeglichst elegant?
Z.B.
C++:
VOLTAGE::VOLTAGE(const char parent_name = "") : FSVARIABLE(parent_name) {
  std::string old_name(this->name);
  delete[] name;
  strcpy(this->name, (old_name + " VOLTAGE").c_str());
}
Übrigens ist es etwas unüblich Klassennamen komplett groß zu schreiben. Man schreibt normalerweise nur Präprozessormakros mit Großbuchstaben.

Gruß
 
Zuletzt bearbeitet:
Hi.
sizeof(name) ist immer konstant (z.B. 4 oder 8). Du müßtest ebenfallls strlen(name)+1 verwenden.

Danke fuer den Hinweis, ist geaendert!

Und warum willst du unbedingt mit C-Strings hantieren? Warum verwendest du nicht einfach std::string?

Ich habe ein paar Probleme die STD Objekte zu verwenden, daher die altertuemliche C Notation.

Z.B.
C++:
VOLTAGE::VOLTAGE(const char parent_name = "") : FSVARIABLE(parent_name) {
  std::string old_name(this->name);
  delete[] name;
  strcpy(this->name, (old_name + " VOLTAGE").c_str());
}

Was wird das dann uebersetzt in char-Format?

Übrigens ist es etwas unüblich Klassennamen komplett groß zu schreiben. Man schreibt normalerweise nur Präprozessormakros mit Großbuchstaben.
tjaja... alte Gewohnheiten... :-(

Besten Gruss
Vitus
 
Nachmal mit Strings
C++:
class FSVariable {
    private:
        std::string name;

    public:
        FSVariable( const std::string& name )
            : name(name) {
        }
};

class Voltage : public FSVariable {
    public:
        Voltage( const std::string& name )
            : FSVariable(name + " VOLTAGE") {
        }
}

Für char* könnte man str(n)cat oder sprintf(n) nutzen,
um die Strings zu Verbinden
C++:
Voltage( const char *prefix )
    : FSVariable(prefix) {

    delete[] name;
    name = new char[ strlen(prefix) + strlen( " VOLTAGE" ) + 1 ];
    strcpy( name, prefix );
    strcat( name, " VOLTAGE" );
}
 
Zurück