klassen, new, konstruktoren und andere grausamkeiten

eijeijei

ich hab da mal so a programm zu dem themaschreiben wollen, damit ich mir das ein bisschen besser vorstellen kann. weil die letzte stunde war ja schon hart. (naja i schreib halt über a katzerl hab i ma dacht, dass kann i ma gut vorstellen… )

aber jetzt häng i dann so vom verständnis wo. und zwar dachte ich mir, dass ich das vielleicht wohl besser mit new (also passendem Speicherplatzreservieren) und pointern vielleicht mach… aber ich hab echt ka ahnung wie.

falls wer zeit hat mir das zu erklären, wär nett wenn ihr des ausführlich macht damit i net noch mehr verwirrt bin…

//Konstruktor und Destruktor

#include <iostream.h>

class Cat
{
      public:
             Cat(int initialAge);               //Konstruktor
             ~Cat();                            //Destruktor
             
             int GetAge();                      //Zugriffsfunktion
             void SetAge(int A);               //Zugriffsfunktion
             void Meow();
             
      private:
              int itsAge;
};

  Cat::Cat(int initialAge)          
  { itsAge = initialAge; }

  Cat::~Cat()                                    
  {}

  int Cat::GetAge()
  { return itsAge; }
  
  void Cat::SetAge(int A)
  { itsAge = A; }
  
  void Cat::Meow()
  { cout << "Miau!\n"; }


int main()
{
    Cat strewner(5);
    strewner.Meow();
    cout << "strewner ist " << strewner.GetAge() << "Jahre alt.\n";
    
    strewner.SetAge(7);
    cout << "Jetzt ist strewner" << strewner.GetAge() << "Jahre alt.\n";
    
    return 0;
}

mag auch sein das andere fehler drinnen sind, also mir bitte dann sagen :slight_smile:

lg

sags amal hat keiner bock mir zu helfen oder is das zu unverständlich was ich eigentlich nur wissen möcht??

Hmm …

seppi@server1:~/pipe$ make cat
g++     cat.cpp   -o cat
In file included from /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/backward/iostream.h:31,
                 from cat.cpp:3:
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
seppi@server1:~/pipe$

→ Ersetze #include <iostream.h> durch #include

seppi@server1:~/pipe$ make cat
g++     cat.cpp   -o cat
cat.cpp: In member function ‘void Cat::Meow()’:
cat.cpp:32: error: ‘cout’ was not declared in this scope
cat.cpp: In function ‘int main()’:
cat.cpp:39: error: ‘cout’ was not declared in this scope
make: *** [cat] Error 1
seppi@server1:~/pipe$

→ cout ist im namespace std, Du mußt also std::cout oder ganz am Anfang using namespace std; schreiben.

seppi@server1:~/pipe$ make cat
g++     cat.cpp   -o cat
seppi@server1:~/pipe$ ./cat
Miau!
strewner ist 5Jahre alt.
Jetzt ist strewner7Jahre alt.
seppi@server1:~/pipe$

Jetzt scheints zu klappen.

Was Deine Frage betrifft:
Wenn ich das richtig verstanden habe, willst Du hier „new“ und Pointer einbauen. Ich weiß nur nicht so recht, wo man das hier sinnvoll einbindet.
Ich überleg mir mal was. :wink:

Meinst Du sowas?

//Konstruktor und Destruktor mit new und delete

#include <iostream>

using namespace std;

class Cat
{
      public:
             Cat(int initialAge);               //Konstruktor
             ~Cat();                            //Destruktor
             
             int GetAge();                      //Zugriffsfunktion
             void SetAge(int A);               //Zugriffsfunktion
             void Meow();
             
      private:
              int itsAge;
};

  Cat::Cat(int initialAge)         
  { itsAge = initialAge; }

  Cat::~Cat()                                   
  { cout << "Cat deleted.\n"; }

  int Cat::GetAge()
  { return itsAge; }
 
  void Cat::SetAge(int A)
  { itsAge = A; }
 
  void Cat::Meow()
  { cout << "Miau!\n"; }


int main()
{
    Cat *strewner; // Pointer auf Cat wird angelegt.
    strewner = new Cat(5); // Neue Katze "strewner" --> Konstruktor aufgerufen
    strewner->Meow(); // -> statt . weil strewner ein Pointer ist.
    cout << "strewner ist " << strewner->GetAge() << " Jahre alt.\n";
   
    strewner->SetAge(7);
    cout << "Jetzt ist strewner " << strewner->GetAge() << " Jahre alt.\n";
    delete strewner; // Katze wird wieder entfernt.
    
    return 0;
}

zu meinen fehlern,

mein compiler hat die headerdatei iostream.h also binde ich die auch ein, andere findet er nicht,
das mit cout geht bei mir aus so, auf uni würd ichs aber auch anders schreiben…

deinen vorschlag muss i mir jetzt noch durchlesen.

aha mit → geht das
hab ich nicht gewusst

also danke dir auf jeden fall, sowas in etwa hab ich auch versucht zu machen :slight_smile: danke

oder du machst statt



(*strewner).Meow();

glaub ich da schreibst den pointer halt aus :confused:

Das geht natürlich auch, is aber nicht so elegant. :wink:

ja aber ich find wenn man beides weis dann versteht mas leichter was das eine sein soll :wink:

Ja, der → ist zugegebenermaßen nicht gerade intuitiv.
Müßt ihr zum Test eigentlich C++ können? Bei uns kommt das garned …

nein nein, is nur C als stoff. aber ich muss sagen, c++ is scho a stückerl anspruchsvoller…
also ganz checken tu ich das mit klassen und wie ich die methoden da drinnen schreib noch net. bin no relativ konfus zeitweise unterwegs is mir heut beim programmieren von unserem jetzigen übungsbeispiel aufgefallen.

Ja, das ist schon klar, daß das nicht sofort im Kopf ist. Es ist auch eine ganz andere Denkweise als beim „normalen“ Programmieren.
Es geht sicher vielen nicht anders, und ich muß auch überlegen, damit mir wieder alles einfällt, was wie in Dat machen.