2016-07-18 8 views
-5

Also das Problem ist, wenn das Programm den Zeiger newOwner erstellt, es plötzlich nicht mehr funktioniert.C++: Beim Erstellen des neuen Zeigers für die Klasse aufhören zu arbeiten Besitzer #fixed

Bearbeiten Danke für den Hinweis, der Code funktioniert und bereits behoben. #include #include #include #include

using namespace std; 

class Owner 
{ 
protected: 
    int idNum; 
    char name[255]; 
    char add[255]; 
public: 
    Owner() 
    { 
     idNum=0; 
     strcpy(name, ""); 
     strcpy(add, ""); 
    }; 
    Owner(int id, char *n, char *a) 
    { 
     idNum=id; 
     strcpy(name, n); 
     strcpy(add, a); 
    }; 
    ~Owner() 
    {}; 
    int getIdNum() 
    { 
     return idNum; 
    }; 
    void setIdNum(int id) 
    { 
     idNum=id; 
    }; 
    char *getName() 
    { 
     return name; 
    }; 
    void setName(char *n) 
    { 
     strcpy(name, n); 
    }; 
    char *getAdd() 
    { 
     return add; 
    }; 
    void setAdd(char *a) 
    { 
     strcpy(add, a); 
    }; 
    Owner *nextOwner=NULL; 
}; 

Owner *headOwner=NULL; 

void addOwner() 
{ 
    char names [255], addrs[255]; 
    int numId; 
    cout<<"variable"<<endl; 
    Owner *newOwner = new Owner(); 
    cout<<"new pointer for newOwner"<<endl; 
    Owner *copyOwner = new Owner(); 
    cout<<"new pointer for copyOwner"<<endl; 

    newOwner -> nextOwner=NULL; 
    copyOwner -> nextOwner=NULL; 
    cout<<"pointing"<<endl; 
    cout<<"New Boat Owner Form"<<endl; 
    cout << "Enter Your Name: "; 
    gets(names); 
    newOwner -> setName(names); 
    cout << "Enter Your Address: "; 
    gets(addrs); 
    newOwner -> setAdd(addrs); 
    if(headOwner == NULL) 
    { 
     numId=1; 
     newOwner -> setIdNum(numId); 
     headOwner=newOwner; 
    } 
    else 
    { 
     int i; 
     copyOwner=headOwner; 
     while(copyOwner!=NULL) 
     { 
      if(i<copyOwner -> getIdNum()) 
      { 
       i=copyOwner -> getIdNum(); 
       copyOwner = copyOwner->nextOwner; 
      } 
     } 
     numId=i+1; 
     copyOwner=headOwner; 
     while(copyOwner->nextOwner != NULL) 
     { 
      copyOwner=copyOwner->nextOwner; 
     } 
     copyOwner->nextOwner=newOwner; 
    } 
} 


int main() 
{ 
    addOwner(); 
    return 0; 
} 

, bevor das Programm funktioniert nicht mehr, wir einen Ausgang für die Suche nach den Fehler gemacht, die „Variable“ -Ausgang angezeigt wird, dann ist Programm stoppen danach arbeiten. kann den Fehlerabschnitt nicht finden.

Bitte helfen Sie mir, die Fehlerquelle zu finden. Danke.

+3

'Owner :: name' und' Owner :: add' werden in 'Owner :: Owner()' baumelt. 'strcpy()' auf ihnen führt zu UB. – songyuanyao

+0

Warum 'char *' und nicht 'string'? Nach Methoden müssen Sie kein ';' – user463035818

Antwort

1

Ihre Programme schlagen in den ersten Zeilen fehl. Sie können in Owner() nicht strcpy machen. In diesen Zeilen kopieren Sie ein '\ 0' in Name [0] und fügen Sie [0] hinzu, aber diese Zeiger wurden nicht initialisiert.

0

Die Besitzerklasse hatte zwei Zeiger namens name und add deklariert, denen kein Speicher zugewiesen ist, und im Konstruktor kopieren Sie die Zeichenfolge, auf die n zeigt, an den Speicherort, auf den der Name zeigt. Ordnen Sie zuerst Speicher für Name und fügen Sie hinzu oder erklären Sie es als ein Array

char name[64], add[128]; 
+0

oh i c. Ich werde sie reparieren. Danke für die Lösungen :) –