Решение 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)
, чтобы получить экземпляр закрытого класса, а затем успешно использует его.