在ArduinoUnit单元测试库中,我提供了一种为TestSuite命名的机制。该库的用户可以编写以下代码:
TestSuite suite("my test suite");
// ...
suite.run(); // Suite name is used here这是预期的用法- TestSuite的名称是字符串文字。然而,为了防止很难找到的bug,我觉得有义务满足不同的用法,例如:
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_;
};有没有什么方法可以改变接口,强制“正确”使用它,这样我就可以取消动态内存分配了?
发布于 2009-06-22 19:48:15
如果你提供了两个重载的构造函数呢?
TestSuite(const char* name) ...
TestSuite(char* name) ...如果使用const char*调用,则构造函数可以复制指针,前提是字符串不会消失。如果使用char*调用,则构造函数可以复制整个字符串。
请注意,当name实际上是动态分配的时,仍然可以通过将const char*传递给构造函数来破坏这种机制。但是,这可能足以满足您的目的。
我应该指出的是,我从来没有真正看到过在API中使用这种技术,这只是我在阅读您的问题时突然想到的一个想法。
发布于 2009-06-22 14:15:35
您可以使用std::string来处理所有内存分配
class TestSuite {
public:
TestSuite(const std::string &name):name_(name) {
}
~TestSuite() {
}
private:
std::string name_;
};malloc编辑:如果您想要避免调用malloc(),可以这样做:
class TestSuite {
public:
TestSuite(const char *name){
memcpy(name_, name, min(16, strlen(name));
}
private:
char name_[16];
};然而,这会浪费一些内存,这在嵌入式平台上可能是一个问题。
发布于 2009-06-22 14:18:13
文档。例如,
/**
* Test suite constructor.
* @param name test suite name cstring, shared
*/
TestSuite(char const *name) {
// ...共享指针意味着所指向的对象在此对象的生命周期内必须是活动的。
https://stackoverflow.com/questions/1027416
复制相似问题