我尝试为两个不同的类实现堆代码,我不想重写堆代码,因为它已经工作(测试和工作)
所以我有了第一个(原始的)类,让我们称之为Job
,它有几个属性。然后我将它修改为抽象的,并有两个类实现了这个Job
类:
class Job {
protected:
long long value1;
long long value2;
...
public:
Job(long long value1, long long value2) : value1(value1), value2(value2) {};
virtual void setValue(long long value);
virtual long long getValue();
};
class AvailableJob : public Job{
public:
AvailableJob (long long value1, long long value2): Job(value1, value2) {};
void setValue(long long value) {
if (value == -1)
return;
value1 = value;
}
long long getValue() {
return value1;
}
};
class UsedJob : public Job{
public:
UsedJob (long long value1, long long value2): Job(value1, value2) {};
void setValue(long long value) {
if (value == -1)
return;
value2 = value;
}
long long getValue() {
return value2 ;
}
};
字符串
类有更多的属性和方法,但这些与这个问题无关。
问题是,我使用HeapStruct
类创建了两个最小堆树,但我希望一个最小堆使用value1
作为引用值,另一个最小堆使用value2
所以我想这样会有用:
class HeapStruct{
private:
vector<Job> heap;
long long size;
long long maxSize;
...
public:
HeapStruct(long long maxSize) : maxSize(maxSize) {
// initialize heap
}
long long getValueAt(long long i) {
return heap.at(i).getValue();
}
void siftUp(long long i) {
// siftUp using job::getValue and job::setValue methods
}
void siftDown(){};
Job getMin(){};
void insertNode(){};
removeNode(){};
};
型
我认为使用Job::getValue
和Job::setValue
方法就足够了,但是我如何告诉HeapStruct
使用AvailableJob
或UsedJob
。现在正在抱怨使用抽象类。
此外,如果这不是最好的方法,你知道一个更好的,我愿意尝试不同的东西。
1条答案
按热度按时间ghg1uchk1#
类成员
vector<Job> heap;
只能存储Job
,而不能存储派生类。如果你需要一个Job
类型的容器,你可以让HeapStruct
成为一个模板,与任何T
一起工作:字符串
并且,可能在C20之前使用SFINAE,或者甚至在C20中将其限制为命名概念到
Job
派生类:型
如果你必须为任何作业使用相同的类型,但不能将它们混合在一起,你可以在那里添加一个虚拟基类来执行类型擦除:
型