В библиотеке модульного тестирования ArduinoUnit я предоставил механизм для присвоения имени TestSuite. Пользователь библиотеки может написать следующее:
TestSuite suite("my test suite");
// ...
suite.run(); // Suite name is used here
Это ожидаемое использование - имя TestSuite является строковым литералом. Однако, чтобы предотвратить труднообнаруживаемые ошибки, я чувствую себя обязанным учитывать различные варианты использования, например:
char* name = (char*) malloc(14);
strcpy(name, "my test suite");
TestSuite suite(name);
free(name);
// ...
suite.run(); // Suite name is used here
Таким образом, я реализовал TestSuite следующим образом:
class TestSuite {
public:
TestSuite(const char* name) {
name_ = (char*) malloc(strlen(name) + 1);
strcpy(name_, name);
}
~TestSuite() {
free(name_);
}
private:
char* name_;
};
Не говоря уже о том, что не удается справиться с ошибками выделения памяти в конструкторе, я бы предпочел просто выделить указатель на переменную-член следующим образом:
class TestSuite {
public:
TestSuite(const char* name) : name_(name) {
}
private:
const char* name_;
};
Есть ли способ изменить интерфейс, чтобы заставить его использовать «правильно», чтобы избавиться от динамического распределения памяти?