Создание экземпляра одноэлементного класса в C

#c #unit-testing #singleton

#c #модульное тестирование #одноэлементный

Вопрос:

У меня есть одноэлементный класс 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;
}
  

Я пытаюсь выполнить модульное тестирование этого класса (у класса есть и другие методы, которые здесь показывать не обязательно).
Я создал 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’. Я просто хочу получить экземпляр, удалить его и назначить ему свой макет экземпляра. Любые предложения о том, как это сделать, поскольку он говорит, что он недоступен?

Комментарии:

1. Вы не можете, и, честно говоря, вы не должны этого делать. Представьте, что ваш класс на самом деле создает правильный одноэлементный экземпляр и просто делает, static foo * instance() { static foo obj; return amp;obj; } Да .. и что теперь ? Короткая версия: ваша архитектура не позволит вам издеваться над этим экземпляром, используя foo as-is. Вот как вы его разработали.

2. Ответ находится в другом замке. Поскольку вы не можете делать то, что хотите, нам нужно больше информации, чтобы помочь вам найти этот другой замок.

Ответ №1:

Если MockClassfoo унаследован от foo, сделайте foo не окончательным:

  1. создайте конструктор и статический указатель foo; * защищенный
  2. определите getInstance в своем макетном классе, который выделяет MockClassFoo вместо foo

Это должно сработать.


Несколько советов о вашем коде:

  • Понтер в C должен быть инициализирован с использованием nullptr (или древнего NULL) и сравниваться с nullptr (или NULL). не с 0.
  • Я предпочитаю добавлять явные частные: ключевые слова в начале класса
  • Мне не нравится идея метода «уничтожить». Вместо этого используйте деструктор

Ответ №2:

Вам нужно создать fooAccessor класс друзей внутри класса foo . Таким образом, foo предоставляет разрешение fooAccessor на доступ к его закрытым членам.

Комментарии:

1. Я не могу этого сделать, поскольку в foo не требуется вносить никаких изменений.

2. Если вы можете загрузить минимально полный пример кода, мы можем помочь вам в решении проблемы.

3. Если вам не разрешено вносить какие-либо изменения foo , вы не сможете нарушить эту инкапсуляцию.