В то время как, на мой взгляд, bers/methods класса - это запах кода, я думаю, что это технически возможно на C++.
В качестве примера предположим, что у вас есть класс собак с отдельными членами/методов для публичного конструктора, за исключением:
#include <iostream>
#include <string>
using namespace std;
class Dog {
public:
Dog(string name) { this->name = name; };
private:
string name;
string bark() { return name + ": Woof!"; };
static string Species;
static int Legs() { return 4; };
};
string Dog::Species = "Canis familiaris";
Теперь по какой-то причине вы хотели бы испытать частных.Для этого вы можете использовать privablic.
Включить заголовок с именем privablic.h вместе с желаемой реализации подобного:
#include "privablic.h"
#include "dog.hpp"
затем сопоставить некоторые пни по типам любого экземпляра элемента
struct Dog_name { typedef string (Dog::*type); };
template class private_member<Dog_name, &Dog::name>;
... и метод экземпляра;
struct Dog_bark { typedef string (Dog::*type)(); };
template class private_method<Dog_bark, &Dog::bark>;
сделать то же самое со всеми статическими членами экземпляра
struct Dog_Species { typedef string *type; };
template class private_member<Dog_Species, &Dog::Species>;
... и статические методы экземпляра.
struct Dog_Legs { typedef int (*type)(); };
template class private_method<Dog_Legs, &Dog::Legs>;
Теперь вы можете проверить их все:
#include <assert.h>
int main()
{
string name = "Fido";
Dog fido = Dog(name);
string fido_name = fido.*member<Dog_name>::value;
assert (fido_name == name);
string fido_bark = (&fido->*func<Dog_bark>::ptr)();
string bark = "Fido: Woof!";
assert(fido_bark == bark);
string fido_species = *member<Dog_Species>::value;
string species = "Canis familiaris";
assert(fido_species == species);
int fido_legs = (*func<Dog_Legs>::ptr)();
int legs = 4;
assert(fido_legs == legs);
printf("all assertions passed\n");
};
Выход:
$ ./main
all assertions passed
Вы можете посмотреть на источники test_dog.cpp и dog.hpp.
ОТКАЗ: Благодаря прозрения других clever people, я собрал вышеупомянутую «библиотеку», способную получить доступ к закрытым членам и методам данного класса C++, не изменяя его определение или поведение. Чтобы заставить его работать, он (очевидно) должен знать и включать реализацию класса.
ПРИМЕЧАНИЕ: Я пересмотрел содержание этого ответа, чтобы следовать директивам, предложенным рецензентами.
Я хотел спросить что-то очень похожее. Но, на мой взгляд, модульное тестирование и большие классы просто плохо смешиваются. –
Ну, разве вы не видите эффекты в OtherClass? –
Вы должны прочитать [Враги разработки, основанной на тестировании, часть I: инкапсуляция] (http://jasonmbaker.wordpress.com/2009/01/08/enemies-of-test-driven-development-part-i-encapsulation/). –