typenloses Array?
-
Darum solltest du auch Zeiger auf die eigentlichen Objekte speichern, siehe this->thats post.
-
Versuch mal folgendes:
#include <iostream> #include <string> using namespace std; int main() { class Test { public: virtual void SetName(string name){}; virtual string GetName(){}; string m_sname; }; class MyTest : public Test { public: void SetName(string name){m_sname = name}; string GetName(){return m_sname;} int zahl; }; Test* array[2]; MyTest* olaf = new MyTest; olaf->SetName(string("Peter"); // olaf.zahl = 5; MyTest* irina = new MyTest; irina->SetName("hans"); array[0] = olaf; array[1] = irina; cout << array[0]->GetName() << " " << array[1]->GetName() << "\n"; system("pause"); }Ich habs jetzt aber nicht ausprobiert, kann sein das kleinere fehler drin sind

-
So funktionierts aber^^
#include <iostream> #include <string> using namespace std; int main() { class Test { string m_sname; public: virtual void SetName(string name){}; virtual string GetName(){return "";}; }; class MyTest : public Test { public: void SetName(string name){m_sname = name;} string GetName(){return m_sname;} int zahl; }; Test* array[2]; MyTest* olaf = new MyTest; olaf->SetName(string("Peter")); // olaf.zahl = 5; MyTest* irina = new MyTest; irina->SetName(string("hans")); array[0] = olaf; array[1] = irina; cout << array[0]->GetName() << " " << array[1]->GetName() << "\n"; system("pause"); return 0; }
-
Hm, bei mir kommt da:
error C2248: "main::Test::m_sname": Kein Zugriff auf private Member, dessen Deklaration in der main::Test-Klasse erfolgte.
:-S
Ich hab hier Visual C++ Express Edition 2005 (Version 8.0).
So viel Ahnung hab ich von C++ leider noch nicht, hoffe ihr könnt mir noch ein bißchen helfen.
-
Zum Testen:
Erweitert um Methoden für Zahl.
#include <iostream> #include <string> using namespace std; int main() { class Test { string m_sname; public: virtual void SetName(string name){}; virtual string GetName(){return "";}; }; class MyTest : public Test { private: int m_zahl; public: void SetName(string name){m_sname = name;} string GetName(){return m_sname;} void SetZahl(int z){m_zahl = z;} int GetZahl(){return m_zahl;} }; Test* array[2]; MyTest* olaf = new MyTest; olaf->SetName(string("Peter")); olaf->SetZahl(5); MyTest* irina = new MyTest; irina->SetName(string("hans")); array[0] = olaf; array[1] = irina; cout << array[0]->GetName() << " " << array[1]->GetName() << array[0]->GetZahl() << "\n"; system("pause"); return 0; }
-
ja sry das hatte ich noch übersehen, was passiert denn wenn du über die Deklaration von m_sname in Test "protected:" schreibst?
-
Andreas_LL schrieb:
ja sry das hatte ich noch übersehen, was passiert denn wenn du über die Deklaration von m_sname in Test "protected:" schreibst?
Ja, damit geht es. Erklärst du mir warum?
Was zudem aber nicht geht ist der zugriff auf eine nicht in der Superklasse vorhandenen Methode. Die scheint wieder getilgt zu werden. Oder kann man irgendwie angeben, ob man ein Objekt eines bestimmten Typs interpolieren will? In Java geht sowas z.B. so: Typ variable = (Typ)variableVonAnderemTyp;
Hier der momentane Code:
#include <iostream> #include <string> using namespace std; int main() { class Test { protected: string m_sname; public: virtual void SetName(string name){}; virtual string GetName(){return "";}; }; class MyTest : public Test { protected: int m_zahl; public: void SetName(string name){m_sname = name;} string GetName(){return m_sname;} void SetZahl(int z){m_zahl = z;} int GetZahl(){return m_zahl;} }; Test* array[2]; MyTest* olaf = new MyTest; olaf->SetName(string("Peter")); olaf->SetZahl(5); MyTest* irina = new MyTest; irina->SetName(string("hans")); array[0] = olaf; array[1] = irina; cout << array[0]->GetName() << " " << array[1]->GetName() << array[0]->GetZahl() << "\n"; system("pause"); return 0; }Grüße, pktm
-
Hi,
"private:" bedeutet das nur Methoden dieser Klasse auf die Eigenschaftsvariablen zugreifen können
"protected:" Bei dieser Einstellung können auch die abgeleiteten Klassen und mit ihnen die Methoden auf die Membervariablen zugreifen.
"public:" Jeder kann auf die Daten zugreifen.Für die Methoden gilt das gleiche, deshalb konntest du ja auch auf die Methoden wie SetName, etc zugreifen, weil sie als public deklariert waren.
Um auf eine Methode oder Membervariable einer Abgleiteten Klasse zugreifen zu können kannst du schreiben:
MyTest* dummy = (MyTest*) array[0];
dummy->GetZahl();in diesem Fall:
cout << array[0]->GetName() << " " << array[1]->GetName() << ((MyTest*)array[0])->GetZahl() << "\n";
-
Danke vielmals, das funktiert!
-
Igit. Das nennt man dann C++?
#include <string> // std::string #include <vector> // std::vector #include <memory> // std::auto_ptr #include <iostream> // std::cout class base { std::string m_name; public: base(std::string const& name) : m_name(name) {} public: std::string const& get_name() const { return m_name; } }; class derived : public base { int m_data; public: derived(int data, std::string const& name) : base(name), m_data(data) {} public: int get_data() const { return m_data; } }; int main() { // std::vector< std::auto_ptr<base> > data; std::vector<base*> data; data.push_back(new base("{- base instance -}")); data.push_back(new derive(10, "{- derived instance -}")); std::cout << "#01: " << data[0]->get_name() << "#02: " << data[1]->get_name() << " - data := " << static_cast<derived*>(data[1])->get_data() << std::endl; // bei std::auto_ptr nicht notwendig! Sonst Speicher freigeben! for (std::vector<base*>::iterator it(data.begin()); it != data.end(); ++it) delete (*it); }... so wäre es doch schöner, oder?