Решение 1, быстрое и простое: сделайте тестовый класс(ы) другом общедоступного.
class Foo {
// ...
private:
friend class FooTest;
};
Таким образом, ваш класс FooTest
может получить доступ ко всем членам открытого класса. Однако таким образом вам нужно изменять исходный класс каждый раз, когда вы хотите получить доступ к закрытым данным из другого теста, и вы пропускаете информацию о тестах в общедоступный API, и вы, возможно, открываете конфликты имен классов (что, если есть / другой/класс FooTest вокруг?), и так далее.
Решение 2, также выполненное правильно: не помещайте частные методы в открытый класс, а создайте частный класс с общедоступными методами.
class Foo {
//
private:
friend class FooPrivate;
FooPrivate *d;
};
FooPrivate
объявляется в своем собственном заголовке, который может быть не установлен, или оставаться в подкаталоге include-privates/ или что-то еще, т. е. он не мешает нормальному использованию. Таким образом, публичный класс остается чистым.
class FooPrivate {
public:
// only public stuff in here;
// and especially this:
static FooPrivate *get(Foo *f) { return f->d; }
};
Затем тест включает закрытый заголовок и вызывает FooPrivate::get(fooObj)
для получения экземпляра закрытого класса, а затем успешно использует его.
person
peppe
schedule
04.04.2014