命名空间中的两个对象将由不同的函数默认初始化并由命名空间内的 class 使用
Two objects in namespace to be default initialized by different functions and used by class within namespace
我有一个奇怪的要求。我有一个命名空间 foo,其中包含两个 bar
类型的已声明对象,即 bar1
和 bar2
,我想通过 class bar 的构造函数对其进行初始化。这是一个合理的方法吗:
namespace foo {
class bar;
foo::bar *bar1;
foo::bar *bar2;
}
class foo::bar
{
/* Initialize bar1 and bar2 in the constructor.
*/
InitializeBar();
};
这个恶作剧背后的原因是我想创建一个类似于 cout
和 cin
的对象,这样 foo::bar1
和 foo::bar2
不需要由用户。更具体地说,我正在使用 ncurses
并希望将 cout
替换为输出 window bar1
并将 cin
替换为输入 window bar2
并重载运算符,这样我认为输出 window 中的 foo::bar1 << a prints
a 和 foo::bar2 >> b
从输入 window 中提取值并将其转储到 b。我可以通过 C 函数调用来执行此操作,但我需要帮助才能将其扩展到 C++。也许 bar1
和 bar2
的默认初始化相应?
一种方法是使用简单函数模式。您将构造函数保持为私有,客户端只能通过两个 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();
}
我有一个奇怪的要求。我有一个命名空间 foo,其中包含两个 bar
类型的已声明对象,即 bar1
和 bar2
,我想通过 class bar 的构造函数对其进行初始化。这是一个合理的方法吗:
namespace foo {
class bar;
foo::bar *bar1;
foo::bar *bar2;
}
class foo::bar
{
/* Initialize bar1 and bar2 in the constructor.
*/
InitializeBar();
};
这个恶作剧背后的原因是我想创建一个类似于 cout
和 cin
的对象,这样 foo::bar1
和 foo::bar2
不需要由用户。更具体地说,我正在使用 ncurses
并希望将 cout
替换为输出 window bar1
并将 cin
替换为输入 window bar2
并重载运算符,这样我认为输出 window 中的 foo::bar1 << a prints
a 和 foo::bar2 >> b
从输入 window 中提取值并将其转储到 b。我可以通过 C 函数调用来执行此操作,但我需要帮助才能将其扩展到 C++。也许 bar1
和 bar2
的默认初始化相应?
一种方法是使用简单函数模式。您将构造函数保持为私有,客户端只能通过两个 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();
}