C++ 在C+中创建singleton类的实例+;

C++ 在C+中创建singleton类的实例+;,c++,unit-testing,singleton,C++,Unit Testing,Singleton,我有一个单亲班: 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

我有一个单亲班:

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;
}
我正在尝试对这个类进行单元测试(这个类也有其他方法,这里不需要说明)。 我创建了一个MockClassfoo,并将类“foo”继承到MockClassfoo中

我创建了一个假的MockClassfoo实例,如我的测试类中所示:

class Test
{
 auto aFake =(MockClassfoo *)MockClassfoo ::instance();
             fooAccessor::set(aFake);
}
但是,在我的类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
    }
};

我不想对“foo”类中指针的可访问性做任何更改。我只想获取实例,删除它并将我的模拟实例分配给它。既然它说它不可访问,你有什么建议吗?

你需要把
fooAccessor
作为类
foo
中的一个好友类。通过这样做,
foo
授予
fooAccessor
权限,以便访问其私有成员。

您需要将
fooAccessor
设置为类
foo
中的好友类。通过这样做,
foo
授予
fooAccessor
访问其私有成员的权限。

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

  • 生成构造函数和静态foo指针;*保护
  • 在模拟类中定义一个getInstance,该实例分配一个MockClassFoo而不是foo一个
  • 它应该会起作用


    关于代码的一些提示:

      C++中的PANTER,应该使用NulLPTR(或古NULL)初始化,并与NulLPTR(或NULL)进行比较。与0无关
    • 我更喜欢在类的开头添加显式的private:关键字
    • 我不喜欢“销毁”方法的想法。改用析构函数

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

  • 生成构造函数和静态foo指针;*保护
  • 在模拟类中定义一个getInstance,该实例分配一个MockClassFoo而不是foo一个
  • 它应该会起作用


    关于代码的一些提示:

      C++中的PANTER,应该使用NulLPTR(或古NULL)初始化,并与NulLPTR(或NULL)进行比较。与0无关
    • 我更喜欢在类的开头添加显式的private:关键字
    • 我不喜欢“销毁”方法的想法。改用析构函数

    我不能这样做,因为不需要对foo进行任何更改。如果您可以上传最简单完整的示例代码,我们可以帮助您解决此问题。如果不允许您对
    foo
    进行任何更改,您不能破坏此封装。我不能这样做,因为不必对foo进行任何更改。如果您可以上载最完整的示例代码,我们可以在这方面为您提供更多帮助以解决此问题。如果不允许您对
    foo
    进行任何更改,您不能破坏此封装。您不能,坦率地说,您不应该这样做。想象一下,您的类实际上创建了一个适当的单例实例,并简单地执行,
    static foo*instance(){static foo obj;return&obj;}
    yes。。现在怎么办?简短版本:您的体系结构不允许您按原样使用
    foo
    模拟此实例。你就是这么设计的答案在另一座城堡里。既然你不能做你想做的事,我们需要更多的信息来帮助你找到另一座城堡。你不能,坦率地说,你不应该这么做。想象一下,您的类实际上创建了一个适当的单例实例,并简单地执行,
    static foo*instance(){static foo obj;return&obj;}
    yes。。现在怎么办?简短版本:您的体系结构不允许您按原样使用
    foo
    模拟此实例。你就是这么设计的答案在另一座城堡里。既然你不能做你想做的事,我们需要更多的信息来帮助你找到另一座城堡。