【问题标题】:How is Non-Virtual Interface pattern imlemented in C++?非虚拟接口模式如何在 C++ 中实现?
【发布时间】:2010-11-19 09:38:23
【问题描述】:

我对单线程和多线程实现都很好奇。

谢谢

【问题讨论】:

  • 我很想知道你在说什么 - 你需要提供更多细节,最好是示例代码。
  • 补充一下 Neil,我不确定您所说的单线程和多线程实现是什么意思。 NVI 与线程没有任何关系,因此单/多线程 NVI 之间的区别与任何类的单/多线程实现之间的区别并没有什么不同。
  • @Nick 这家伙似乎沉迷于小型 C++ 垃圾邮件盛宴。我怀疑他是否理解自己的问题。
  • Enigma,你刚才问了一个问题,得到了这个作为你的答案,现在你在问如何实现它。这通常源于一开始并没有完全理解您要解决的问题。
  • 对不起,我突然想到了非虚拟接口模式背后的原因。我本可以搜索它,但对 SO 成员的意见很感兴趣..

标签: c++ design-patterns


【解决方案1】:

您的问题含糊不清,但听起来您想要Curiously recurring template pattern

在网上有很多比我更好的人来解释这一点,它在 boost 库中被大量使用。查看boost.iterator 文档和代码以获取一个很好的示例

【讨论】:

    【解决方案2】:
    class base
    {
    public:
        void bar()
        {
            getReady();
            barImpl();
            cleanup();
        }
        void getReady() {cout << "Getting ready. ";}
        void cleanup()  {cout << "Cleaning up.\n";}
    protected:
        virtual void barImpl() {cout << "base::barImpl. ";}
    }
    
    class derived : public base
    {
    protected:
        virtual void barImpl() {cout << "derived::barImpl. ";}
    }
    
    int main()
    {
        base b;
        derived d;
        b.bar();
        d.bar();
    }
    

    输出:

    Getting ready. base::barImpl. Cleaning up.
    Getting ready. derived::barImpl. Cleaning up.
    

    【讨论】:

    • 有一个代码示例总是很好,但一些解释就可以了(虽然我明白它的作用)。
    • 在你的情况下,虚拟受到保护。私人呢?
    • private 没问题,但是很多书都不推荐虚函数,因为语义有点混乱。
    • 实际上语义非常简单:重写虚函数与访问规范完全正交。 :^&gt;(好吧,我同意,这令人困惑。)
    【解决方案3】:

    如果您身边有Effective C++(第 3 版)的副本,Scott Meyers 在第 35 条(第 170 页)中对 NVI 习语进行了很好的处理。

    【讨论】:

      【解决方案4】:

      Here you go...

      谷歌,是不是很神奇? :P

      【讨论】:

        猜你喜欢
        • 2011-09-22
        • 2011-02-13
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多