C++ 具有多态性和不同数据结构的程序设计

C++ 具有多态性和不同数据结构的程序设计,c++,boost,vector,polymorphism,pointers,C++,Boost,Vector,Polymorphism,Pointers,我想我这里有一个设计问题,我非常感谢你的帮助 我有一个表示基本算法的类库 class BaseAlgo: public Algo<double> { public: /// data structures // ... // struct Item { double profit; double weight; double xjSolution; }; typedef std::pair<double, std::vector<Ite

我想我这里有一个设计问题,我非常感谢你的帮助

我有一个表示基本算法的类库

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_;
}
在我在DerivedAlgo中重载的虚拟函数中,我需要访问DerivedScaledItem的附加参数,这与多态性的初衷并不完全一致。是否有可能,或者您是否提出了不同的设计方法?目前我对任何事情都持开放态度,因为我完全被卡住了

现在,BaseAlgo中的largeItems_uu成员ptr_u向量持有ScaleItems(内部作为指针)。我想,我可以这样使用它:

// 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;
}
//在DerivedAlgo中
void someMethod(std::vector::iterator someiterator){
DerivedScaledItem doubledItem={};
二元数m.first=4.5;
doubledItem.second=某个迭代器;
二元数附加=2;
大项推回(新的无界caledItem(doubledItem));
boost::ptr_vector::迭代器it=largeItems_uu.begin();

std::cout我猜您没有告诉boost如何克隆ptr_vector-s元素,如下所述:

因此,在这一行中,您创建了向量的一个副本(您可以通过声明
largeItems
作为引用来避免这种情况),它们通过
ScaledItem
的构造函数进行复制,从而释放您的额外成员

boost::ptr_vector<BaseAlgo::ScaledItem> largeItems = knapsack.getLargeItems();
boost::ptr_vector largeItems=knapsack.getLargeItems();
关于您对另一种设计的疑问:

  • 您可以将vectors元素的类型作为模板参数传递给基类
  • 您可以将向量移动到派生类中,并仅提供(虚拟、抽象)函数来访问基类中的单个元素。如果基类也能够创建元素,则可能需要某种工厂方法。因为您不希望向量中包含基类元素

首先:感谢您的回答!我喜欢模板参数的想法,今晚我将尝试一下。此外,我将尝试在测试代码中声明largeItems作为引用是否能够解决问题,但这似乎是有意义的!好的,将largeItems声明为const引用解决了问题。但我还有一个后续问题:什么当我将BaseAlgo::ScaledItems的迭代器作为虚拟函数的函数参数时会发生这种情况?当我声明基类型的迭代器时,附加参数是否自动丢失?:)已解决,我使用动态强制转换,并使用虚拟析构函数将ScaledItem从typedef更改为实际结构,以使其工作。
// 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;
boost::ptr_vector<BaseAlgo::ScaledItem> largeItems = knapsack.getLargeItems();