在 C++ 中创建单例实例 class

Create instance of singleton class in C++

我有一个单例 class foo:

class foo
{
    static foo* pointer;
    foo();

public:
    static foo* instance();
    static void destroy();
}

foo::foo()
{
    
}



foo* foo::instance()
{
    if (pointer == 0)
        pointer = new foo();
    return pointer;
}


void foo::destroy()
{
    delete pointer;
    pointer = 0;
}

我正在尝试对此 class 进行单元测试(class 还有其他方法,这里没有必要展示)。 我创建了一个 MockClassfoo 并将 class 'foo' 继承到 MockClassfoo.

我创建了一个伪造的 MockClassfoo 实例,如我的测试所示 class:

class Test
{
 auto aFake =(MockClassfoo *)MockClassfoo ::instance();
             fooAccessor::set(aFake);
}

但是在我的 class fooAccessor 中,我想获取 foo 的实例..删除指针并在其中分配我的模拟实例,这是不可能的:

class fooAccessor
{
public:
    static void set(foo * other)
    {
        foo::instance();
        delete foo::pointer; //here i get error saying pointer is inaccessible
        foo::pointer = other; //here i get error saying pointer is inaccessible
    }
};

我不想对 class'foo' 中指针的可访问性进行任何更改。我只想获取实例,将其删除并将我的模拟实例分配给它。因为它说它无法访问,所以关于如何做到这一点有什么建议吗?

您需要在 class foo 中交 fooAccessor 朋友 class。通过这样做,foo 授予 fooAccessor 访问其私有成员的权限。

如果 MockClassfoo 如果继承自 foo,则使 foo 不是最终的:

  1. 创建构造函数static foo指针;* protected
  2. 在你的 Mock class 中定义一个 getInstance 分配一个 MockClassFoo 而不是 foo 一个

它应该可以解决问题。


关于您的代码的一些提示:

  • C++ 中的一个 ponter,应该使用 nullptr(或古老的 NULL)初始化,并与 nullptr(或 NULL)进行比较。不是 0.
  • 我更喜欢在 class
  • 的开头添加明确的 private: 关键字
  • 我不喜欢“销毁”方法的想法。改用析构函数