-1

使用以下单例模式:

C++ Singleton 设计模式http://www.yolinux.com/TUTORIALS/C++Singleton.html

我制作了一个专门的 Singleton 类,而不是使用其中一个隐藏的类,例如 Boost::Serialization::Singleton。

我怎样才能给单例调用起别名呢?不得不写很烦人

namespace::class::get_instance().method()到处

具体来说,我怎样才能给它的namespace::class::get_instance()一部分起别名?

具体来说,我希望能够在堆栈而不是堆上执行此操作,因为公共构造函数、复制构造函数和赋值运算符都是私有化的……但似乎无法做到。

使用函数指针对我不起作用。

编辑:据我所知,不使用宏,因为这些宏通常是不受欢迎的。/我知道typedef,我希望有一些简单的相对,就像其他语言一样

Singleton.method()此外,我在 Stackoverflow 上看到的案例/答案很少,应该是使用 #define 的充分理由

这应该从主要/使用角度调用库类。

稍微相关:如何为单例函数创建别名?但我不仅需要特定的功能。

理想化的例子:

定义的库 LIB。

用户:

LIB::server_interface::get_instance()::do_something()。

说lib会自动连接池/其他操作。并且您正在与某些服务进行广泛的交互,因此必须广泛地预先添加以下内容是一种痛苦,并且不会产生漂亮的代码。此外,作为使用 lib 的用户,您不想将命名空间{

} 在你的代码中我想。

4

3 回答 3

4

由于引用是对象的别名,也许您需要将引用绑定到实例?

namespace::class& sngl_ref = namespace::class::get_instance();
....
sngl_ref.method();
于 2013-06-28T16:52:08.523 回答
2

我想知道您认为单例模式的用途是什么。它的用途非常有限,其中某些对象在程序中最多只能存在一次。例如,操作显示器的程序本质上需要一个显示对象。在这样的程序中创建副本将是错误的。至少在 IMO 中,单例是关于数据的。如果您的程序在复制该数据将是错误的上下文中需要单个数据对象,那么您就有一个单例的候选者。我迷失了那个 get_instance() 函数。即使它有多个名称,也应该只有一个实例。

例如,我的书包括一个“游戏笔”类型的专业图形窗口对象(请注意,这些书是为新手准备的)。用户可以自由声明围栏“对象”。将它们等复制到他们心中的内容,但程序总是最多包含一个数据实例。如果程序中当前不存在 playpen 对象,则声明一个将创建必要的底层数据结构。如果一个游戏围栏对象已经存在,声明一个“新”对象只是为已经存在的对象提供一个新名称(和操作方式)。

您提出问题的事实非常强烈地表明您患有“闪亮的新锤子”综合症并且正试图用它来砸螺丝。

弗朗西斯

于 2013-06-29T12:18:39.733 回答
0

最简单的方法是声明一个 typedef 快捷方式:

typedef namespace::class nc;

这将大大减少打字。

另一种方法是在您的客户端编译单元中有单元本地方法声明:

namespace
{
    void call_method()
    {
        namespace::class::get_instance().method();
    }

    // Alternatively to shortcut the getInstance() part specifically
    namespace::class& getClassInstance()
    {
        return namespace::class::get_instance();
    }
}
于 2013-06-28T16:46:43.593 回答