Ну, во-первых - принцип единоличной ответственности .Это означает, что ваш archeTest
не должен управлять всеми тестовыми объектами.Просто сделайте (в) знаменитом Manager
это!
#include <vector>
class TestManager{
std::vector<archeTest*> _tests;
public:
// either
void AddTest(archeTest* test){
_tests.push_back(test);
}
// OR
archeTest* CreateTest(/*here_be_params*/){
archeTest* test = new archeTest(/*params*/);
// do whatever
_tests.push_back(test);
return test;
}
void RunAllTests() const{
for(int i=0; i < _tests.size(); ++i)
_tests[i]->runTests();
}
// if you create tests in here, you also need to release them at the end
// ONLY do this if your created the tests with CreateTest
// or if you transfer the ownership of the test pointer to TestManager
~TestManager(){
for(int i=0; i < _tests.size(); ++i)
delete _tests[i];
}
};
Запустите с
TestManager tmgr;
// create all your tests, either with
// archeTest* p = tmgr.CreateTest();
// OR
// archeTest* p = new archeTest();
// tmg.AddTest(p);
// and then run with
tmgr.RunAllTests();
Опять же, смотрите комментарии в реализации TestManager
.
Теперь, если вам действительно не нужен дополнительный класс ... это на самом деле проще, но это своего рода запах кода.Просто добавьте ваш класс в конструкторе archeTest
в статический связанный список - проблема решена!Удалите его на уничтожение снова, конечно.Это работает, потому что каждый производный класс xxxstructor автоматически вызывает версию базового класса - конструктор * con * перед своим собственным и конструктор * de * после своего собственного:
#include <list>
class archeTest{
private:
typedef std::list<archeTest*> TestList;
static TestList _all_tests;
// to erase the right test on destruction
TestList::iterator _this_test;
public:
archeTest(){
_all_tests.push_back(this);
}
~archeTest(){
_all_tests.erase(_this_test);
}
static void RunAllTests(){
for(TestList::iterator it = _all_tests.begin(); it != _all_tests.end(); ++it)
(*it)->runTests();
}
};
// in some TestManager.cpp
#include "TestManager.h"
TestManager::TestList TestManager::_all_tests;
Запустите его с помощью простого
// create all your tests;
// ...
archeTest::RunAllTests();
, поскольку это статическая функция-член, ему не нужен экземпляр.;
Обратите внимание, что я использовал связанный список, поскольку это позволяетбезопасное удаление теста в середине списка без аннулирования ссылок, хранящихся в других объектах теста.