【问题标题】:Two objects in namespace to be default initialized by different functions and used by class within namespace命名空间中的两个对象默认由不同的函数初始化并由命名空间内的类使用
【发布时间】:2015-07-18 00:42:56
【问题描述】:

我有一个奇怪的要求。我有一个命名空间 foo,其中包含两个声明的 bar 类型的对象,即 bar1bar2,我想通过类 bar 的构造函数对其进行初始化。这是一种合理的方式吗:

namespace foo {
    class bar;
    foo::bar *bar1;
    foo::bar *bar2;
}

class foo::bar
{
    /* Initialize bar1 and bar2 in the constructor.
     */
    InitializeBar();
};

这个恶作剧背后的原因是我想创建一个类似于coutcin 的对象,这样foo::bar1foo::bar2 不需要由用户定义。更具体地说,我正在使用 ncurses 并希望将 cout 替换为输出窗口 bar1cin 与输入窗口 bar2 并重载运算符,从而使输出窗口中的 foo::bar1 << a prints a 为我认为合适,foo::bar2 >> b 从输入窗口中提取值并将其转储到 b 中。我可以通过 C 函数调用来做到这一点,但我需要帮助才能将其扩展到 C++。也许bar1bar2的默认初始化相应?

【问题讨论】:

  • 如果你有多个 bar 对象,bar1bar2 会被多次“初始化”?
  • @EricZ 不,我希望它们只被初始化一次,这也是秘密的。用户永远不会调用构造函数,只使用这两个对象,类似于iostream的cout和cin的使用方式。
  • 那你就可以使用工厂模式了。

标签: c++ namespaces window ncurses


【解决方案1】:

一种方法是使用简单函数模式。您将构造函数保持为私有,并且客户端只能通过两个 get 函数访问这些对象。您可能还想禁用复制构造函数和复制赋值运算符。

// .h
namespace foo
{
   class bar: boost noncopyable
   {
   public:
      static bar* getInputWindow()
      {
         static bar s_input;
         return &s_input;
      }
      static bar* getOutputWindow()
      {
         static bar s_output;
         return &s_output;
      }

   private:
      bar()
      {
      }
   };

   // global/namespace objects clients should directly use
   extern bar *input;
   extern bar *output;
}

// .cpp
namespace foo
{
   bar *input = bar::getInputWindow();
   bar *output = bar::getOutputWindow();
}

【讨论】:

  • 我以前从未想过单例模式。应该澄清一件事:永远不要在头文件中定义命名空间变量,只能在源文件中。我已经编辑了您的示例,以使未来的读者清楚这一点,因为我在上面浪费了太多时间。非常酷的代码,会更频繁地适应单例模式。
  • 当然,接受您的编辑。请注意,这不是单例模式。单例模式是指一个类只能被实例化一次的场景。但在你的情况下,它不是。对我来说,它更像是工厂模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
相关资源
最近更新 更多