c++ - 与 ctors 类 union 的替代方案

标签 c++ data-structures tree

我有一个 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/

相关文章:

c++ - 如何可编程检测用户是否具有管理员权限(可以运行安装程序)

C++ 定义一个使用 lambda 闭包的函数

data-structures - 查找排序后的序列的中间 50%(在 Boost Accumulators 或其他数据结构中)

clojure - Clojure 中的线程注释

c++ - 我在哪里可以为我的 C++ 项目找到一个好的 Scope Guard 实现?

java - 如何创建自己的高效数据结构?

python - 获取 O(1) 中总和最小的数的因子

json - 将 JSON Multiway Tree 解码为 F# Multiway Tree Discriminated Union

recursion - 递归计算k-ary树中的节点

c++ - 运行 OFX 插件