以下代码代表策略设计模式。
考虑以下程序结构:
// 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; }
};
我有一个client.cpp,它接收Derived的上下文
#include "client.hpp"
#include <iostream>
void Client::operate() {
std::cout << solver_.solve() << std::endl;
}
这是客户端的头文件:
#include "base.hpp"
class Client {
public:
Client(Base& b): solver_(b) {}
void operate();
private:
Base& solver_;
};
我的主要:test.cpp
#include "client.hpp"
#include "derived.hpp"
int main() {
Derived d;
Client c(d);
c.operate() ;
}
我希望它打印77,但该程序根本不打印任何东西。
客户端通过它的构造函数接收Derived的上下文,并将其存储为Base&amp; solver_; 首先,调用Client的操作方法,该方法调用从Base派生的类的适当求解方法。在这种情况下,派生。
是的,那应该输出77,但事实并非如此。该程序编译良好,没有错误,只需清理退出。有任何想法吗 ?
我使用以下命令编译它:
g++ -o program.exe client.cpp test.cpp
我正在使用GCC版本5.3.0
答案 0 :(得分:0)
我找到了解决方案。问题是某些库没有用g ++链接,即libstdc ++ - 6.dll。
使用-static-libgcc -static-libstdc ++选项可以修复此问题
该定义给出: &#34;当g ++程序用于链接C ++程序时,它通常会自动链接到libstdc ++。如果libstdc ++作为共享库提供,并且未使用-static选项,那么这将链接到libstdc ++的共享版本。这通常很好。但是,冻结程序使用的libstdc ++版本有时很有用,而不会一直到完全静态链接。 -static-libstdc ++选项指示g ++驱动程序静态链接libstdc ++,而不必静态链接其他库。&#34;
请参阅:random sample