Προς το περιεχόμενο

Help!!Run Time Error...


afnman

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα.... Εχω τον εξής κώδικα σε C++ (γραμμένο στο Dev-C++ 4.0):

#include <iostream.h>

class human

{

protected:

char *name;

public:

human()

{

cin >> name;

cout << name;

}

};

 

class man: public human

{

public:

man()

{

cout << name;

}

};

 

int main()

{

human h1;

man m1; //<--- RUN-TIME ERROR

 

return 0;

}

Γιατι με πετάει απο το πρόγραμμα οταν κάνω εισαγωγή ονόματος απο την παράγωγη κλάση (man),ενω απο την human όχι??

Κάτι παίζει με τους δείκτες αλλα τι???? Μπορει να μου εξήγησει κανεις σε ποιό low-level τι συμβαίνει??

Ξέρω οτι δεν έχω δεσμεύσει μνήμη για την name που θα έπρεπε κανονικά αλλά παραδόξως παίζει και έτσι γενικά...

Επισκέπτης
Δημοσ.

το προβλημα το προκαλει το γεγονος οτι εχεις cin>>name mesa ston constructor..an to bgaleis 9a deis oti soy trexei..

for example:

 

#include <iostream>

 

using namespace std;

 

class human

{

protected:

char *name;

public:

human()

{

name="jesus";//cin>>name;//cout << name;

}

void print_name(void){cout<<name;}

};

 

class man: public human

{

public:

//man():human(){};

};

 

int main()

{

human h1;

h1.print_name();

man m1; //<--- RUN-TIME ERROR

m1.print_name();

for(double i=0;i<1000000000;i++);

 

return 0;

}

 

de kserw na to eksighsw omws...

Επισκέπτης
Δημοσ.

dwse oti diabaseis me cin ws orisma ston constructor..dld

h cin 9a einai sth main..

Δημοσ.

Οk...μπορώ να βρώ την λύση αλλά το θέμα ειναι ότι δεν καταλαβαίνω για ποιο λογο συμβαινεί αυτό...

Δημοσ.

Το πρώτο πρόβλημα προέρχεται απλά από την παραδοχή σου ότι δεν δεσμεύεις μνήμη για τον pointer “char* name” με αποτέλεσμα να δείχνει (pointing) σε κάποια τυχαία θέση εντός της μνήμης όπου εκτελείται η εφαρμογή συνεπώς όταν κανείς εισάγει κάποια δεδομένα αυτά θα γραφθούν σε αυτή την τυχαία θέση που αν είσαι τυχερός μπορεί να δείχνει σε κάποιο stack space οπότε το πρόβλημα κρύβεται για λίγο ή άλλοτε σε code τμήμα οπότε το πρόγραμμα καταστρέφεται.

 

Εδώ θα πρέπει να υπενθυμίσω πως πότε (όχι το εάν – είναι δεδομένο ότι θα συμβεί) θα «σκάσει» το πρόβλημα εξαρτάται από το λειτουργικό σύστημα που χρησιμοποιείς αλλά και από την ίδια την run time library που χρησιμοποιεί ο C++ compiler σου.

 

Στον C/C++ Builder 6.0 μου ο παρακάτω κώδικας με τις απαραίτητες διορθώσεις δουλεύει σωστά, αν αφαιρέσεις το new statement τις περισσότερες φορές το πρόγραμμα καταρρέει (ο disassembler υποδεικνύει άγνωστη εντολή –απλά ο char* δείχνει δυστυχώς ;) σε code segment).

 

-

 

Το δεύτερο πρόβλημα έχει να κάνει με το ότι η class man από την στιγμή που συνδέεται με την human (: public human ) καλεί αυτόματα τον human constructor ο οποίος δημιουργεί (derive) μια νέα human class με εντελώς διαφορετικές διευθύνσεις στις εσωτερικές μεταβλητές της οπότε η εντολή cout << name της man υποδεικνύει σε μια διαφορετική μεταβλητή.

 

Μια λύση που μπορώ να προτείνω είναι να περνάς στον man constructor ένα pointer στην human class που επιθυμείς αφού βέβαια έχεις ορίσει πρωτύτερα στην human class την men class ως friend ώστε η τελευταία να μπορεί να έχει πρόσβαση και στα μη public τμήματα της πρώτης – βέβαια ως λύση θεωρώ ότι είναι κάπως άκομψη..

 

>
#include <iostream.h>

class human
{
  friend class man;
  
  protected:
     char *name;

  public:
     human()
     {
        name  =  NULL;
        name  =  new   char[128];
        
        cin >> name;
        cout << name;
     }

     ~human()
      {
        delete[]   name;
      }
};

class man
{
  public:
     man(human *ptrHuman)
     {
        cout << ptrHuman->name;
     }
};

int main()
  {
     human h1;
     man   m1(&h1);

     return 0;
  }

 

Καλή τύχη!

:)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...