我正在尝试设计一段需要使用算法的代码。该算法将来应该很容易被其他人替换。所以在我的 LargeClass 中必须有一种方法来调用特定的算法。
我在下面提供了一些示例代码。我的想法是创建一个接口(interface)类 IAlgorithm,这样您就必须自己提供一个实现。我认为您可以在 LargeClass 的构造函数中将它初始化为您想要的派生类。但是下面的代码在 VS2015 中无法编译,因为 IAlgorithm: cannot instantiate abstract class
我的问题:我应该如何设计才能得到我想要的结果?
提前致谢!
算法.h
class IAlgorithm
{
protected:
virtual int Algorithm(int, int) = 0;
};
class algo1 : public IAlgorithm
{
public:
virtual int Algorithm(int, int);
};
class algo2 : public IAlgorithm
{
public:
virtual int Algorithm(int, int);
};
算法.cpp
#include "Algorithm.h"
int algo1::Algorithm(const int a, const int b)
{
// Do something
}
int algo2::Algorithm(const int a, const int b)
{
// Do something
}
源.cpp
#include "Algorithm.h"
class LargeClass
{
private:
IAlgorithm algo;
};
int main()
{
}
最佳答案
对此我的第一个想法是,为什么要使用如此原始的界面?
好的,我们有一个要求,即某些进程需要将算法发送到其中。这个算法必须是多态的,它必须接受两个整数并返回一个整数。
一切都很好。标准库中已经有一个用于此的构造。它调用 std::function
。这是任何具有兼容接口(interface)的函数对象的包装器。
例子:
#include <functional>
#include <iostream>
class LargeClass
{
public:
using algorithm_type = std::function<int(int,int)>;
LargeClass(algorithm_type algo)
: _algo(std::move(algo))
{}
int apply(int x, int y) {
return _algo(x,y);
}
private:
algorithm_type _algo;
};
int test(LargeClass&& lc) {
return lc.apply(5,5);
}
int divide(int x, int y) { return x / y; }
int main()
{
// use a lambda
std::cout << test(LargeClass{ [](auto x,auto y){ return x + y; } });
// use a function object
std::cout << test(LargeClass{ std::plus<>() } );
// use a free function
std::cout << test(LargeClass{ divide } );
// use a function object
struct foo_type {
int operator()(int x, int y) const {
return x * 2 + y;
}
} foo;
std::cout << test(LargeClass{ foo_type() } );
std::cout << test(LargeClass{ foo } );
}
关于c++ - 使用接口(interface)类作为另一个类中的成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38290427/