7

ich eine Klassenhierarchie mit zwei Diamanten haben, verursacht durch alle Klassen in einem Dekorateur Muster zu erweitern, die (sie erstrecken sich bereits praktisch):Code-Analyse des Eclipse CDT nicht versteht virtuelle Vererbung

namespace _sandbox { 

class A { 
    public: 
     virtual ~A() {} 
     virtual void foo()=0; 
}; 

class ADecorator : public virtual A { 
    private: 
     A* decoratedA; 
    public: 
     ADecorator(A* a) : decoratedA(a) {} 
     void foo() {return decoratedA->foo();} 
}; 

class AImpl : public virtual A { 
    public: 
     void foo() {}; 
}; 

class B : public virtual A { 
    public: 
     virtual ~B() {} 
     virtual void bar()=0; 
}; 

class BDecorator : public ADecorator, public B { 
    private: 
     B* decoratedB; //Copy of the pointer with a different type 
    public: 
     BDecorator(B* b) : ADecorator(b), decoratedB(b) {} 
     void bar() {return decoratedB->bar();} 
}; 

class BImpl : public B, public AImpl { 
    public: 
     void bar() {}; 
}; 

B* b = new BDecorator(new BImpl()); 

} 

Grafisch:

 A 
     /|\ 
    v /v| \ v 
    /| \ 
AImpl B ADecorator 
    |/\ | 
    |/ \ | 
    |/  \| 
BImpl  BDecorator 

GCC kompiliert dies kein Problem, aber die Codeanalyse der Finsternis besteht darauf, dass BDecorator nicht implementiert foo()

The type '_sandbox::BDecorator' must implement the inherited pure virtual method '_sandbox::A::foo' 

Ich kann dieses Problem zum Schweigen bringen, indem ich diese Art von Fehler in den Einstellungen auf "Info" setze, aber ich frage mich, ob es tatsächlich einen Fehler im Code gibt, den GCC übersehen hat oder ob ich etwas tun kann, um den Code zu erstellen Analyse akzeptieren Sie den Code? Wenn es möglich ist, möchte ich diese Codeanalysefunktion nicht zum Schweigen bringen, damit ich tatsächliche Fehler leicht erkennen kann.

Wie unterscheidet sich BImpl hinsichtlich der implementierten Methoden von BDecorator? Die Code-Analyse bekämpft nichts über BImpl, aber die Art, wie sie eine Implementierung von foo() haben, ist ähnlich.

+0

Coole ASSCI Kunst, +1. – Maroun

+1

es ist ASCII, Junge – hrkz

+1

Ja, +1 für einen neuen Benutzer zu sein und die Frage ganz klar mit genug Code fragen, +1 für kühle ASCII Graphen. Die Frage selbst ist auch eine gute Frage. –

Antwort

2

Ich denke, Sie müssen möglicherweise Ihren Code erneut indizieren. Klicken Sie mit der rechten Maustaste auf Ihr Projekt im Projekt-Explorer, klicken Sie auf Index und dann auf Alle Dateien aktualisieren. Dadurch wird Eclipse gezwungen, den gesamten Code zu indexieren.

+0

Das scheint nichts zu ändern. Ich habe versucht, die Warnungen von der Registerkarte Probleme zuerst zu löschen, um sicherzustellen, dass sie auch wieder generiert werden. – Baro

+0

Das behebt das gleiche Problem für mich. – PaulQ

+0

... und reparierte es jetzt für mich zweimal. : P Nochmals vielen Dank. – PaulQ