从一个班级转换到另一个班级怎么可能?

时间:2019-05-27 14:11:35

标签: c++ data-structures

我正在学习数据结构中的BST。我在课本中遇到了一些我听不懂的代码。

我用这种方式简化了它:

Tree应该是二进制搜索树。

Node是Tree中的嵌套结构。

Element用于在Node中存储数据。(所有这些原本应为模板类,  节点最初还应该存储密钥等。但是,在这种情况下,我将省略这些详细信息。)

#include <iostream>

class Element {

};

class Tree {
   public:
    struct Node {
        Element *element;
    };

    Node *root;
    Element* find() {
        Node *tmp = root;
        return (Element *) tmp; // this line
    }
};

int main() {
    Tree t;
    std::cout << t.find() << '\n';
    return 0;
}

在第16行(如注释所示),(Element *)的功能是什么? 我想这是一次转换,但是如何在两个不同的类之间进行转换呢? (如果我的假设正确)

1 个答案:

答案 0 :(得分:3)

  

在第16行(如注释所示),(Element *)的功能是什么?

     

我想这是一次转化

是的。这是一个明确的转换;也称为C样式转换。

  

但是如何在两个不同的类之间进行转换?

在两种情况下,可能会在两个类之间进行转换:一个类具有转换构造函数,而另一个类具有转换运算符。

dataNode既没有转换构造函数,也没有转换运算符,因此它们不能相互转换。但是,所示程序不会在类之间转换。它将在指针和类之间转换。

C样式强制转换根据源类型和目标类型执行静态强制转换,const强制转换和重新解释强制转换的一种或组合。对于指向不相关类的指针,没有有效的静态转换,因此将执行重新解释转换。

重新解释指向不相关类型的指针会导致该指针仅具有有限的用途。您可以将其相等性与另一个指针进行比较,也可以将其转换回正确的类型,但是除非有少数情况,否则间接重定向这种重新解释的指针具有未定义的行为。这不是例外情况之一,因此我们可以得出结论,强制类型转换的“功能”是使结果几乎没有用。


P.S。还有另一个问题。 Element从未被初始化,因此它具有不确定的值,因此t.root会读取一个不确定的值,因此程序的行为是不确定的。