【问题标题】:Dynamic binding in C++?C++中的动态绑定?
【发布时间】:2014-06-02 14:50:52
【问题描述】:

我需要澄清一下 C++ 中的动态绑定。
我解释了我的问题。
我必须使用二叉搜索树来实现字典。我决定还实现一个 AVL 树(自平衡二叉搜索树)。我已经成功实现了两个类:BST(二叉搜索树)和扩展 BST 的 AVL。我的程序运行正常。
我的目标是只有一个指针,我可以从 BST 类切换到 AVL 类,询问用户“你想使用哪个结构?”在程序开始时。
其余代码相同,因为 BST 和 AVL 具有相同的方法名称(即使它们执行不同的操作 -> 覆盖)。
我通过这种方式达到了我的目标:

cout << "whitch structure would you like to use? [1] for BST, [2] for AVL"; 
short choise;  
cin >> choise;

BST a;  
AVL b;  
BST* dictionary;

if (choise == 1)
    dictionary = &a;  
else if (choise == 2)
    dictionary = &b;    
.  
.  
.  
dictionary->doSomething();

我的问题是:
这是一个正确的方法吗?这是动态绑定的例子吗?

感谢您的关注,如果我没有正确解释我的问题,我深表歉意,但这是我在这个精彩网站上的第一篇文章!

【问题讨论】:

    标签: c++ dynamic-binding


    【解决方案1】:

    这是动态绑定的例子吗?

    假设AVL 派生BST,那么是的。

    这是正确的方法吗?

    假设AVL 派生BST,那么是的。

    这是最好的方法吗?好吧,也许不是。你总是在实例化 both 种树,即使只使用过一种。这似乎很浪费。

    更常见的方法是实际有条件地构造它们:

    std::unique_ptr<BST> dictionary;
    if (choise == 1)
        dictionary.reset(new BST());  
    else if (choise == 2)
        dictionary.reset(new AVL());
    
    // ...
    
    assert(dictionary.get());
    dictionary->doSomething();
    

    除非你对动态分配非常敏感,或者你的系统上没有堆,或者你在某个地方的超紧密循环中做这些事情,否则这种方法更传统。

    不过,归根结底,这几乎是一回事。

    【讨论】:

    • 我理解你的方法,我意识到你是对的。我有一个错误:“'unique_ptr' 不是 std 的成员”。我还包括了 。你能告诉我有什么问题吗?
    • @user3699677:不是 C++11 编译器? :) 你可以使用 C++03 std::auto_ptr 并小心,或者使用 boost::shared_ptr。或者只是手动 newdelete(但不要)。
    • 问题出在编译器上(我太笨了)。我改变了它......现在还有另一个(也是最后一个)问题:“断言没有在这个范围内声明”
    • @user3699677: &lt;cassert&gt; 是首选,否则耶!
    【解决方案2】:

    如果AVL 类公开继承自BST 类,那么,是的,这是正确的。

    【讨论】:

      【解决方案3】:

      这是一个多态的例子,动态绑定是多态在运行时的表现。

      由于 AVL is-a BST,您绝对应该让 AVL 公开继承自 BST。 那么是的,您的应用程序将能够多态地处理这两种类型。

      【讨论】:

        【解决方案4】:

        另一种方法可能是将平衡算法与一般 BST 数据结构分开。例如,您可以使用 AVL 或 RBT 或其他东西。

        要使用的算法可以在构造函数中传递。

        【讨论】:

        • 这只是将问题转移到另一个范围。
        猜你喜欢
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多