2017-04-11 3 views
0

Der folgende Code repräsentiert das Strategieentwurfsmuster.C++ verknüpfte Klassen seltsames Verhalten

Betrachten Sie die folgende Programmstruktur:

//base.hpp

#ifndef BASE_HPP 
#define BASE_HPP 

class Base { 
    public: 
    virtual ~Base() {}; 
    virtual int solve() = 0; 
}; 

#endif 

//derived.hpp

#include "base.hpp" 

class Derived: public Base { 
    public: 
    virtual int solve() { return 77; } 
}; 

Ich habe einen client.cpp, die aus einem Kontext erhält Abgeleitet

#include "client.hpp" 
#include <iostream> 

void Client::operate() { 
    std::cout << solver_.solve() << std::endl; 

} 

Dies ist die Header-Datei von Client:

#include "base.hpp" 

class Client { 
    public: 
    Client(Base& b): solver_(b) {} 
    void operate(); 
    private: 
    Base& solver_; 
}; 

Mein Haupt: test.cpp

#include "client.hpp" 
#include "derived.hpp" 

int main() { 
    Derived d; 
    Client c(d); 
    c.operate() ; 
} 

ich es 77 drucken erwarten würde, aber das Programm druckt nicht überhaupt nichts.

Client erhält einen Kontext, abgeleitet von seinem Konstruktor, und speichert ihn als Basis & solver_; Zuerst wird die Operate-Methode von Client aufgerufen, die die entsprechende Solve-Methode der Klasse aufruft, die von Base abgeleitet ist. In diesem Fall Abgeleitet.

Richtig, das sollte 77 ausgeben, tut es aber nicht. Das Programm kompiliert fein und keine Fehler, nur sauber beenden. Irgendwelche Ideen ?

ich es mit folgendem Befehl kompiliert:

g++ -o program.exe client.cpp test.cpp 

Ich bin mit GCC Version 5.3.0

+1

[funktioniert für mich] (http://ideone.com/QZBLPI). Haben Sie versucht, einen Debugger zu durchlaufen? –

+0

Danke, ich denke, das könnte ein Compiler-Problem sein. Welche Version von gcc verwendest du? – wedran

+0

Versuchen Sie, alle Objektdateien (* .o) und die ausführbare Datei zu löschen und neu zu kompilieren. Wenn Sie etwas wie make verwenden, führen Sie make clean aus. –

Antwort

0

ich die Lösung gefunden. Das Problem war, dass einige der Bibliotheken nicht durch g ++ verbunden waren, nämlich libstdC++ - 6.dll.

Dieses Problem kann durch die Verwendung -static-libgcc -static-libstdC++ Optionen

Die Definition gibt fixiert werden. „Wenn das g ++ Programm verwendet wird, ein C++ Programm zu verknüpfen, ist es normalerweise automatisch Links gegen libstdC++ Wenn libstdC++ ist als shared library verfügbar, und die Option -static wird nicht verwendet, dann wird diese mit der freigegebenen Version von libstdC++ verknüpft. Das ist normalerweise in Ordnung, aber es ist manchmal nützlich, die Version von libstdC++ einzufrieren, die vom Programm verwendet wird bis hin zu einer vollständig statischen Verbindung. Die Option -static-libstdC++ weist den g ++ - Treiber an, libstdC++ statisch zu verknüpfen, ohne andere Bibliotheken statisch zu verbinden. "

See: libstdc++-6.dll not found