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
[funktioniert für mich] (http://ideone.com/QZBLPI). Haben Sie versucht, einen Debugger zu durchlaufen? –
Danke, ich denke, das könnte ein Compiler-Problem sein. Welche Version von gcc verwendest du? – wedran
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. –