2009-06-22 37 views
2

ArduinoUnit單元測試庫中,我提供了一個給TestSuite一個名字的機制。庫的用戶可以編寫以下內容:如何防止需要複製傳遞給avr-gcc C++構造函數的字符串?

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_; 
}; 

有沒有什麼辦法可以改變界面強制它被'正確'使用,以便我可以取消動態內存分配?

回答

2

如果您提供了兩個重載的構造函數呢?

TestSuite(const char* name) ... 
TestSuite(char* name) ... 

如果調用一個const char*,則該構造可以使指針的拷貝,假設該字符串不會消失。如果調用char*,構造函數可以創建整個字符串的副本。

注意,它仍然有可能通過傳遞const char*給構造時name實際上是動態地分配給顛覆了這一機制。但是,這可能足以滿足您的需求。

我應該注意到,我從未真正見過這種技術在API中使用,這只是我在閱讀您的問題時想到的一個想法。

-1

爲什麼你在使用char *和malloc的時候,你有很好的C++字符串類,它可以在其構造函數中使用字符串或char *

+1

因爲,不幸的是,avrlibc使用Arduino的(和AVR-GCC)沒有一個STL實現... – 2009-06-22 14:17:09

-1

你能夠使用std :: string嗎?你可以把它當作std::string name_,並有STL照顧的內存分配給你..

class TestSuite { 
    public: 
     TestSuite(const char* name) : name_(name) {} 

     ~TestSuite() {} 

    private: 
     std::string name_; 
}; 

不要忘了包括<string>

Reference

+1

沒有STL是不支持的Arduino(GCC編譯/ avrlibc)。 – 2009-06-22 14:25:18

1

那麼,你可以使用的std :: string,將採取所有內存分配的護理

class TestSuite { 
public: 
    TestSuite(const std::string &name):name_(name) { 
    } 

    ~TestSuite() { 
    } 

private: 
    std::string name_; 
}; 

編輯: 如果是調用malloc()函數,你想避免你能做到這一點:

class TestSuite { 
public: 
    TestSuite(const char *name){ 
    memcpy(name_, name, min(16, strlen(name)); 
    } 

private: 
    char name_[16]; 
}; 

但是,這會浪費一些內存,這可能是一個問題在嵌入式平臺上。

+0

我想,但是由Arduino(和avr-gcc)使用的avrlibc沒有STL實現... – 2009-06-22 14:18:03

+0

噢好吧!也許你應該實現類似stl的字符串,所以你不必處理malloc。這是OOP的要點。 – Ben 2009-06-22 14:21:31

+0

我可以做到這一點,但在它下面仍然會調用malloc(),不會,所以我不確定我真的獲得了什麼(除了一些更多的代碼維護!)。 – 2009-06-22 14:30:22

1

文檔。例如,

/** 
* Test suite constructor. 
* @param name test suite name cstring, shared 
*/ 
TestSuite(char const *name) { 
// ... 

共享指針意味着尖銳的物體必須在該對象的壽命期間是活的。

1

擁有char name[XYZ] TestSuite的成員(XYZ的大小足以容易地顯示名稱)並使用strncpy複製字符串(最大長度爲XYZ-1)。

相關問題