2016-06-09 5 views
0

Ich habe gründlich nach einer Antwort ohne Erfolg gesucht. Ich habe angefangen mit C++ - Gaddis-Lehrbuch als Referenz anzufangen. Ich weiß, dass es eine einfache Antwort auf dieses Problem gibt, aber ich habe Probleme, es herauszufinden. Hier ist mein Code:Keine Ausgabe mit einem Rückgabefehler von 1 bei der Verwendung von Zeigern auf char in C++

class Employee 
{ 
    private: 
    char *name; 
    int idNumber; 
    char *department; 
    char *position; 
    void initName(const char *n) 
{ 
    name = new char[strlen(n) + 1]; 
    strcpy(name, n); 
} 
void initDepartment(char *d) 
{ 
    department = new char[strlen(d) + 1]; 
    strcpy(department, d); 
} 

void initPosition(char *p) 
{ 
    position = new char[strlen(p) + 1]; 
    strcpy(position, p); 
} 

public: 

Employee() 
{ 
    strcpy(name, ""); 
    idNumber = 0; 
    strcpy(department, ""); 
    strcpy(position, ""); 

} 
Employee(char *nam, int num, char *dep, char *posit) 
{ 
    initName(nam); 
    idNumber = num; 
    initDepartment(dep); 
    initPosition(posit); 
} 

Employee(const char *nam, int num) 
{ 
    initName(nam); 
    idNumber = num; 
    strcpy(department, ""); 
    strcpy(position, ""); 
} 

~Employee() 
{ 
    delete [] name; 
    delete [] department; 
    delete [] position; 
} 

void setName(char *n) 
{ 
    name = new char[strlen(n) + 1]; 
    strcpy(name, n); 
} 

void setIdNumber(int num) 
{ 
    idNumber = num; 
} 

void setDepartment(char *d) 
{ 
    department = new char[strlen(d) + 1]; 
    strcpy(department, d); 
} 

void setPosition(char *p) 
{ 
    position = new char[strlen(p) + 1]; 
    strcpy(position, p); 
} 

const char * getName() const 
{ 
    return name; 
} 

int getIdNumber() const 
{ 
    return idNumber; 
} 

const char * getDepartment() const 
{ 
    return department; 
} 

const char * getPosition() const 
{ 
    return position; 
} 
}; 

int main(int argc, char** argv) 
{ 
const int SIZE = 50; 
const char name[SIZE] = "Mark Jones"; 
Employee employee(name, 3452); 
const char *ptr = NULL; 

ptr = employee.getName(); 

cout << ptr << endl; 

return 0; 
} 
+1

Was ist das Problem, Mann? Welchen Fehler bekommst du? Auf welcher Linie? BTW, diese 'strcpy (department," ");' und ähnliche Zeilen sehen extrem seltsam aus, du solltest 'memset' verwenden, um den Inhalt von' department' zu löschen. – ForceBru

+0

Mit einem Zeiger, standardmäßig (ignoriere, dass er initialisiert werden könnte) mit Müll), zeigt nichts an. Etwas muss instanziiert werden, auf das der Zeiger zeigen kann - also können Sie etwas zuweisen, das nicht instanziiert wurde? Sehen Sie sich die Zeichenfolgen genau an und wie Sie sie im Konstruktor behandeln. – Nim

+0

@Nim, ein C++ Zeiger zeigt immer irgendwo hin. Es kann auf Null zeigen oder auf etwas zeigen, auf das Ihr Programm nicht zugreifen darf, aber es zeigt immer irgendwo hin. – nicomp

Antwort

1

Im Standardkonstruktors Sie leere Zeichenfolge in den Papierkorb Zeiger kopieren:

Employee() 
// name and all other members are not initialized 
{ 
    strcpy(name, ""); // << copy to unallocated memory 
    idNumber = 0; 
    strcpy(department, ""); // << and here 
    strcpy(position, ""); // << and here 
} 

Der richtige Standardkonstruktors würde sein:

Employee() 
: name(nullptr) // Initialize all members here 
, idNumber(0) 
, department(nullptr) 
, position(nullptr) 
{ 
    // Initialize c-strings 
    initName(""); 
    initDepartment(""); 
    initPosition(""); 
} 

Sie const alle benutzen zusammen nicht vergessen. Und in ähnlicher Weise andere Konstrukteure:

Employee(const char* nam, int num, const char* dep, const char* posit) 
: name(nullptr) // << Initialize all members here 
, idNumber(num) // << Initialize number with proper value 
, department(nullptr) 
, position(nullptr) 
{ 
    initName(nam); 
    initDepartment(dep); 
    initPosition(posit); 
} 

Employee(const char* nam, int num) 
: name(nullptr) // Initialize all members here 
, idNumber(num) // << Initialize number with proper value 
, department(nullptr) 
, position(nullptr) 
{ 
    initName(nam); 
    initDepartment(""); 
    initPosition(""); 
} 

Proper Funktionen Parameter:

void initName(const char *n) 
{ 
    name = new char[strlen(n) + 1]; 
    strcpy(name, n); 
} 
void initDepartment(const char *d) 
{ 
    department = new char[strlen(d) + 1]; 
    strcpy(department, d); 
} 

void initPosition(const char *p) 
{ 
    position = new char[strlen(p) + 1]; 
    strcpy(position, p); 
} 

Und vergessen Sie nicht Speicher in Setter zu löschen (sonst ist es ein memleak):

void setName(const char *n) 
{ 
    delete[] name; 
    name = new char[strlen(n) + 1]; 
    strcpy(name, n); 
} 

void setDepartment(const char *d) 
{ 
    delete[] department; 
    department = new char[strlen(d) + 1]; 
    strcpy(department, d); 
} 

void setPosition(char *p) 
{ 
    delete[] position; 
    position = new char[strlen(p) + 1]; 
    strcpy(position, p); 
} 

Diese sollte alle Ihre Laufzeitfehler beheben.

+0

@teivas vielen dank! Ich schätze es sehr! – davis

0

Verwenden Sie lieber die Elementfunktionen im Konstruktor. Die Zeiger werden nicht initialisiert, wenn der Konstruktor beginnt, aber die Mitgliederfunktionen wird sie initialisiert werden:

Employee(const char *nam,int num) 
{ 
    initName(nam); 
    idNumber = num; 
    //strcpy(department,""); 
    //strcpy(position,""); 
    initDepartment(""); 
    initPosition(""); 
} 
+0

Danke, deine Antwort hat funktioniert. Ist es, weil ich Speicher für die ptrs nicht zugeteilt habe, dass strcpy in diesem Fall nicht funktioniert hat? – davis

+0

@davis Ja, 'department' hat keinen Wert, mit dem es beginnen könnte. 'initDepartment' verwendet' new', um Speicher zuzuordnen, auf den 'department' dann zeigen kann. – wally