Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » const-Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.11.2006, 08:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
ich hab hier folgendes Problem:


C++:
class baseObject {};
class Object : public baseObject {};

class base
{
  virtual const baseObject **get_objects() const;
};

class A : public base
{
  virtual const Object **get_objects() const;
};



Nun bekomme ich folgenden Fehler wenn bei class A::get_objects das "const" hinten dran ist:


Code:
layer.hpp:353: error: conflicting return type specified for 'virtual const Object** A::get_objects() const'
layer.hpp:115: error:   overriding 'virtual const baseObject** base::get_objects() const'



Wenn ich das "const" nur bei class A::get_objects hinten weglasse, kompiliert es, nur kann ichs dann logischerweise nicht mehr in ner konstanten instanz der Klasse verwenden.

Wie löst man das am geschicktesten?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.11.2006, 08:33 Uhr
ao

(Operator)


Wenn du den Rückgabetyp ändern willst, ist das kein Fall für Polymorphie. Vermutlich hast du einen Entwurfsfehler gemacht, aber um das nachzuvollziehen, müsste man wissen, was baseObject, Object, base und A sind.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.11.2006, 08:48 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
dem standard nach kann man das ja. Hab gerade rausgefunden das, wenn man nur einen "einfachen" pointer zurückgibt (jeweils) funktioniert das ganze so wies oben steht. Nur ich brauch ich eben den Pointer auf das Array.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.11.2006, 09:23 Uhr
ao

(Operator)



Zitat von FloSoft:
wenn man nur einen "einfachen" pointer zurückgibt

Du meinst so?

C++:
class baseObject {};
class Object : public baseObject {};

class base
{
  virtual const baseObject *get_objects() const;
};

class A : public base
{
  virtual const Object *get_objects() const;
};


Das geht bei mir auch nicht. Gleicher Fehler:

Code:
getobjects.cpp(11) : error C2555: 'A::get_objects' : overriding virtual function
differs from 'base::get_objects' only by return type or calling convention

Compiler: MS VC++ 6

Was ich meinte, ist: Du hast vielleicht die Klassenbeziehungen falsch abgebildet. Ich versuche mal ein Beispiel, was hoffentlich nicht zu sehr hinkt:

C++:
class Bein {};    // allgemeines Bein
class Elefantenbein : public Bein {}; // besonderes Bein

class Tier
{
    virtual const Bein ** get_Beine () const;
};

class Elefant : public Tier
{
    virtual const Elefantenbein ** get_Beine () const;
};


Erkennst du, dass Elefant::get_Beine eine ganz andere Methode ist als Tier::get_Beine? Und eine andere Tierart (z.B. Giraffe) hat wieder andere Beine. Bei diesem Ansatz ist get_Beine nicht polymorph, also ist die ganze virtual-Geschichte hier nicht angebracht.

ao

Dieser Post wurde am 07.11.2006 um 09:23 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.11.2006, 12:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich mein das so:


C++:

class baseObject {};
class Object : public baseObject {};

class base {
public:
  virtual const baseObject *getObject() const { return objects[0]; };
  
  baseObject **objects;
};

class A : public base {
public:
  virtual const Object *getObject() const { return (Object*)objects[0]; };
};



Das geht.

Das hier nicht:


C++:
class baseObject {};
class Object : public baseObject {};

class base {
public:
  virtual const baseObject **getObject() const { return objects; };
  
  baseObject **objects;
};

class A : public base {
public:
  virtual const Object **getObject() const { return (Object**)objects; };
};



Aber hast schon recht, das design so ist nicht richtig, denn sind ja nicht alle "Beine" "Elefantenbeine".
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.11.2006, 14:02 Uhr
Th




Zitat von Verfasser:

Compiler: MS VC++ 6


ao, was für einen alten (nicht standard-konformen) Compiler benutzt DU denn ?

Das was FloSoft geschrieben hat (mit einfachen Pointern) funktioniert und ist so im Standard definiert (overriding with dependant class pointer), aber dies ist ja eher für Create-Methoden gedacht (und nicht für Getter-Methoden).

Ich denke auch, ein Redesign wäre hier angebracht (vllt. doch lieber templates statt dynamische Containerklassen verwenden?)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.11.2006, 18:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von Th:

Ich denke auch, ein Redesign wäre hier angebracht (vllt. doch lieber templates statt dynamische Containerklassen verwenden?)

Ja das war sinnvoll, war eh etwas chaos, wir haben das nun anders gelöst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.11.2006, 14:35 Uhr
stephanw
localhorst



Zitat von FloSoft:
Hab gerade rausgefunden das, wenn man nur einen "einfachen" pointer zurückgibt (jeweils) funktioniert das ganze so wies oben steht.

Das ist richtig. Darum ist Dein Problem auch kein const-Problem. Wenn Du das const in Deinem ersten Beispiel an einer der get_objects() Funktionen weglässt, ist es einfach eine andere Funktion als die virtuelle der Basisklasse.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: