我有一个 C++ 设计相关的问题。
我正在为 HW 作业构建树。 树的实现非常简单。基本上它是一个模板化类
template <typename TYPE, typename KEY>
class Tree
{
public:
void Insert(TYPE& node);
void Remove(TYPE& node);
TYPE& Find (KEY key);
//etc.
};
到目前为止只是背景。 现在,稍后当我使用 Tree 时,我有一个 Employee 类,我想拥有 2 棵树,但是一次使用 ID 作为键,另一个使用 Salary 作为键,但我不想复制数据。 显然我需要实现 2 个不同的比较函数。我的第一次尝试是做这样的事情:
class Employee
{
public:
int ID;
float Salary;
};<p></p>
<p>enum COMPARE_RESULT
{
LESS_THAN = -1,
EVEN = 0,
GREATER_THAN = 1
}
template
class IComparable
{
public:
virtual COMPARE_RESULT Compare (const T& other) const = 0;
};</p>
<p>class EmployeeCompareByID : public Employee, public IComparable
{
public:
Compare (const T& other) const
{
//Compare IDs and return result
}
};</p>
<p>class EmployeeCompareBySalary : public Employee, public IComparable
{
public:
Compare (const T& other) const
{
//Compare Salaries and return result
}
};</p>
<p>typedef union
{
Employee employeeData;
EmployeeCompareByID employeeCompareByID;
EmployeeCompareBySalary employeeCompareBySalary;
}EmployeeUnion;</p>
<p>//finally the main would do something like this:
int main()
{
//first tree key is by ID
Tree empTreeByID;
//second tree key is by salary
Tree empTreeBySalary;</p>
<pre><code>EmployeeUnion emp;
emp.employeeData.ID = 1;
emp.employeeData.Salary = 1000.11;
empTreeByID.Insert(emp.employeeCompareByID);
empTreeBySalary.Insert(emp.employeeCompareBySlary);
//the same emp is referenced in both trees. Each by it's relevant member in union
</code></pre>
<p>}
</p>
但是这种方法失败了,因为我的 Employee 类有一个构造函数、复制构造函数和运算符重载,所以在 Employee 上定义 union 是不可能的。 此外,这种方法需要 Tree 实现在 TYPE 上执行 static_cast IComparable 的模板参数,这对我来说似乎很好。
另一种可能的解决方案是将函数指针传递给 Tree 构造函数,并带有指向该实例的适当 Compare 函数的指针,但在我看来,这是一个不优雅的解决方案,并且可能非常困惑并且以后难以调试。
谷歌搜索对类使用 union 的限制,我发现一篇帖子建议使用转换运算符重载来解决与我的问题类似的问题,但没有展开太多内容。
我确定这是一个相当普遍的问题,有一个共同的设计解决方案,只是我不知道而已。
任何想法或意见表示赞赏
最佳答案
您代码中的实际问题是您试图将比较和员工数据结构放置到同一个对象中。它们应该是这样的不同对象:
template<class T> class ICompare {
virtual bool Compare(const T &a, const T &b) const=0;
};
然后显然您需要修改 Tree 构造函数:
template<class T> class Tree {
Tree(const ICompare<T> &c) : c(c) { }
...
const ICompare<T> &c;
};
关于c++ - 与 ctors 类 union 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5731278/