Feld aus Zeigern auf Objekte verschiedener Subklassen



  • Hallo,

    Ich versuche ein Feld aus Zeigern auf Objekte verschiedener Subklassen zu benutzen. Dazu benutze ich als Typ für das Feld die Basisklasse der Subklassen.

    Ich bekomme jedoch diese Meldung in der Fehlerliste wenn ich versuche ein Object zu erstellen:

    IntelliSense: Ein Wert vom Typ ""Server *"" kann keiner Entität vom Typ ""Rechner *"" zugewiesen werden.

    Könnte mir jemand erklären was ich falsch mache?

    class Rechner
    {
    public:
    
    	Rechner();
    	~Rechner();
    	char* Name;
    	int RAM;
    	virtual int getSpeicherkapazitaet() ;
    
    private:
    
    };
    
    Rechner::Rechner()
    {	Name="testrechner";
    	RAM=1024;
    }
    
    Rechner::~Rechner()
    {
    }
    
    #include "Rechner.h"
    #include "enum servertyp.h"
    #include <vector>
    #include <iostream>
    using namespace std;
    
    class Server: public Rechner{
    public:
    	Server();
    	Server(char*, int , int, Servertyp);
    	~Server();
    	Servertyp a;
    	int ROMZahl;
    	vector<int> ROM;
    	int getSpeicherkapazitaet();
    
    private:
    
    };
    
    Server::Server()
    {
    	Name= "testserver";
    	RAM= 1024;
    	ROM.push_back (200);
    	a= Mailserver;
    	ROMZahl=1;
    }
    
    Server::Server(char* x, int y, int z, Servertyp w)
    {
    	Name= x;
    	RAM= y;
    	ROMZahl=z;
    	a= w;
    	int g;
    	cout<<"Kapazitaet der Festplaten angeben.";
    	 for (int i = 0; i < ROMZahl; i++ ){ 
    		cout<<"Festplate ";cout<<i+1 ;cout<<":";cout<<endl;
           cin>>g;
    	   ROM.push_back (g);
        }
    
    }
    
    Server::~Server()
    {
    }
    
     int Server::getSpeicherkapazitaet(){
    	int x=0;
    
    	 for (int i = 0; i < ROMZahl; i++ ){ 
    		x=x+ROM[i];    	 
    		return x;
    	 }
    
    };
    
    #include "Rechner.h"
    
    class Workstation: public Rechner{
    public:
    	Workstation();
    	Workstation::Workstation(char* x, int y, int z);
    	~Workstation();
    	int ROM;
    
    	int getSpeicherkapazitaet();
    
    private:
    
    };
    
    Workstation::Workstation()
    {	Name= "testworkstation";
    	RAM= 1024;
    	ROM=200;
    }
    
    Workstation::Workstation(char* x, int y, int z )
    {
    	Name= x;
    	RAM= y;
    	ROM=z;
    
    }
    
    Workstation::~Workstation()
    {
    }
    
    enum Servertyp {Mailserver,Webserver,Applicationsserver,Spieleserver};
    
    #include "stdafx.h"
    
    #include "Server.h"
    #include "Workstation.h"
    
    int main()
    {	
    	Rechner *Comp[99];
    	Comp[1]=new Server(); //hier zeigt es beim = den fehler an
    	Comp[2]=new Rechner();
    
    	delete Comp;
    	return 0;
    }
    

    Gruß Kaion



  • Rechner ist die Basisklasse und Server leitet davon ab. Wo ist das Problem? Bist du dir sicher, dass du den korrekten Code gepostest hast?

    Ahja, Arrays und Polymorphie - ein heimtückischer Fehler, ein Array-Feld hat nämlich nur eine Größe von sizeof(Rechner) Bytes.
    Benutze einen std::vector<> .



  • rthrthrthrth schrieb:

    Ahja, Arrays und Polymorphie - ein heimtückischer Fehler, ein Array-Feld hat nämlich nur eine Größe von sizeof(Rechner) Bytes.

    Bist Du sicher, dass Du Dir den richtigen Code angesehen hast?



  • Was Intellisense ankringelt ist belanglos. Was sagt der Compiler?



  • Abgesehen von dem, was schon gesagt wurde:

    1. Dein ~Rechner() sollte virtual sein. Und wenn der Destruktor leer ist, dann schreib das doch direkt hin:

    virtual ~Rechner() = default;
    

    2. Bist du sicher, dass du mit #include "enum servertyp.h" eine Datei mit Leerzeichen haben willst? Würde ich von abraten.

    3. Dies hier:

    Rechner *Comp[99];
        Comp[1]=new Server(); //hier zeigt es beim = den fehler an
        Comp[2]=new Rechner();
     
        delete Comp;
    

    Was zur Hölle soll das delete da? Dafür fehlen die delete s zu den beiden new s. Aber warum kümmerst du dich überhaupt um new und delete? Willst du nicht lieber einen std::vector<std::unique_ptr<Rechner>> benutzen anstatt dieses komischen C-Style Arrays?



  • Tut mir leid, ich hab mich so an der Fehlermeldung aufgehangen. Ich habe den compiler nicht einmal versucht anzuwerfen.
    Nun bekamm ich als ersted einen C2011 den konnte ich schon beheben. In dem ich Rechner nochmal als Header definiere. Daudurch ist auch mein Ausgangsfehler verschwunden da Rechner nicht mehr mehrfach aufgerufen wird.

    Das delete war nur damit ich das aufräumen nicht vergesse, das mir sich der Compiler so darüber beschwert ist mir schon klar.

    Das Feld benutze ich weil mir meine Übungsaufgabe das gerade so vorschreibt.
    Habe Vektor ja auch schon bei den ROMS benutzt.

    Das mit der Leerzeile im enum verstehe ich irgendiw nicht.

    Jetzt bekomme ich nur noch unaufgelöste Extrene bei der virtuellen Funktion getSpeicherkapazität.

    Danke für die Hilfe.



  • Kaion schrieb:

    Jetzt bekomme ich nur noch unaufgelöste Extrene bei der virtuellen Funktion getSpeicherkapazität.

    Implementiere sie.



  • Bin dabei. ^^



  • Kaion schrieb:

    Nun bekamm ich als ersted einen C2011 den konnte ich schon beheben. In dem ich Rechner nochmal als Header definiere.

    Das hört sich so an, als ob du tatsächlich (und nicht nur im gezeigten Code) keine Includeguards verwendest. Das solltest du ändern.


Log in to reply