我想我在这里遇到了设计问题,非常感谢您的帮助。
我有一个代表基本算法的类 Base。
class BaseAlgo: public Algo<double>
{
public:
/// data structures
// ...
//
struct Item {
double profit;
double weight;
double xjSolution;
};
typedef std::pair<double, std::vector<Item>::iterator> ScaledItem;
protected:
std::vector<Item> & items_;
boost::ptr_vector<ScaledItem> largeItems_;
}
BaseAlgo 有一些功能,其中一些是虚拟的,另一些则不是。
作为派生类,我有
class DerivedAlgo: public BaseAlgo
{
public:
/// enhanced data structures
// ...
//
struct DerivedScaledItem : ScaledItem {
int additional;
};
}
在我在 DerivedAlgo 中重载的虚拟函数中,我需要访问 DerivedScaledItem 的附加参数,这不是多态性的初衷。是否有可能,或者您是否提出了不同的设计方法?我现在对任何事情都持开放态度,因为我完全被困住了。
现在,BaseAlgo 中的 largeItems_ 成员 ptr_vector 持有 ScaledItems(内部作为指针)。我想,我可以像这样使用它:
// in DerivedAlgo
void someMethod(std::vector<Item>::iterator someiterator){
DerivedScaledItem doubledItem = {};
doubledItem.first = 4.5;
doubledItem.second = someiterator;
doubledItem.additional= 2;
largeItems_.push_back(new UnboundedScaledItem(doubledItem));
boost::ptr_vector<DerivedScaledItem>::iterator it = largeItems_.begin();
std::cout << "added large item " << *it << std::endl;
}
当我计算刚刚添加的对象时,additional 设置为 2。但之后,调用 largeItems_ 的 getter,附加字段将设置回 0,然后只设置 ScaledItem 中已知的两个字段。
// in BaseAlgo
const boost::ptr_vector<ScaledItem>& getLargeItems() const
{
return largeItems_;
}
// from my test.cpp
DerivedAlgo obj;
// ... define someiterator
obj.someMethod(someiterator);
boost::ptr_vector<BaseAlgo::ScaledItem> largeItems = knapsack.getLargeItems();
boost::ptr_vector<DerivedAlgo::DerivedScaledItem>::iterator it = largeItems.begin();
std::cout << "read large item " << *it << std::endl;