Frage

Ich brauche einen char-Array innerhalb einer Klasse zu speichern und senden Sie es dann. Ich muss zugeben, dass ich ein bisschen verwirrt über Zeiger bin und habe alles versucht, ich mir vorstellen kann, aber es kann nicht die Arbeit. Hier ist, was ich habe:

#include <iostream>
using namespace std;

class Test {
public:
    void setName(char *name);
    char getName();
private:
    char m_name[30];
};

void Test::setName(char *name) {
    strcpy(m_name, name);
}

char Test::getName() {
    return *m_name;
}

void main() {

    Test foobar;
    char name[] = "Testing";
    foobar.setName(name);
    cout << foobar.getName();
}

Natürlich erwarte ich, dass setName () in der Klasse die Zeichenfolge „Testing“ speichern und getName () sollte zurückgeben „Testing“. Aber stattdessen erhalte ich nur die ersten Buchstaben T. Was mache ich falsch?

Ich denke, ich sollte std Strings verwenden, aber zuerst möchte ich gerne verstehen, warum dies nicht funktioniert. Soweit ich weiß, soll dies auch mit char-Arrays arbeiten?

War es hilfreich?

Lösung

Nur einen Zeiger zurück:

const char* Test::getName() const
{
    return m_name;
}

und einen Konstruktor für die class Test hinzufügen, die die eingekapselten Array null beenden würde:

Test::Test()
{
    m_name[0] = 0;
}

, so dass Sie nicht fragen, für Probleme, wenn jemand class Test instanziiert und ruft nicht setName() auf der Instanz.

Andere Tipps

In Test::getName() Sie sind wieder nur ein Zeichen (erstes Zeichen). Stattdessen sollten Sie die Adresse des ersten Zeichens zurückkehren, von wo aus die Zeichenfolge ändern beginnt, das heißt den Rückgabetyp char* und die Return-Anweisung return m_name;

Wenn Sie einen Zeiger haben, p, der Zeiger Dereferenzierungsoperator * „folgt“ den Zeiger so der Ausdruck *p ausgewertet wird, was auch immer das Objekt der Zeiger zeigt auf.

In vielen Situationen der Name eines Arrays wie m_name kann wie ein Zeiger verhalten. Somit *m_name zur ersten char im Array auswertet, da dies die Art ist der Name des Arrays, wenn es als ein Zeiger interpretiert, zeigt auf.

Da Strings in C sind als Zeiger auf Zeichen dargestellt, sollten Sie nicht den Zeiger dereferenzieren, aber schicken Sie es intakt.

Viele vorgeschlagen haben Sie strncpy() verwenden, um die Eingabezeichenfolge in das Array zu schreiben, da es macht (Art) die Überprüfung der Grenzen. Es ist jedoch nicht optimal ist, ist es die Semantik ungerade und eine Zeichenfolge in einen begrenzten Puffer zu kopieren ist wirklich nicht das, was es entworfen wurde, für. Es ist besser, zu untersuchen, ob es eine enorme Auswahl der snprintf() Funktion in Ihrer Umgebung hat, und zu verwenden, die in etwa so:

snprintf(m_name, sizeof m_name, "%s", name);

Und es ist sicherer als strncpy() strcpy() in void Test::setName() zu verwenden

Wenn Sie dies wollen einfach C ++ sein nicht char Zeiger verwenden, wenn Sie einen sehr haben, ganz bestimmten Grund, dies zu tun!

Wechseln von char Zeiger auf std :: string und sehen, ob das Ihr Problem löst:

#include <iostream>
#include <string>
using namespace std;

class Test {
public:
    void setName(std::string name);
    std::string getName();
private:
    std::string m_name;
};

void Test::setName(std::string name) {
    m_name = name;
}

std::string Test::getName() {
    return m_name;
}

void main() { 
    Test foobar;
    foobar.setName("Testing");
    cout << foobar.getName();
}

Für Bonuspunkte, machen den Parametertyp in setName eine const std :: string &.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top