我想使用C++其採用可變數量結構與字符C風格的API *成員如下:用char *構建動態結構的更好方法?
typedef struct _FOO
{
const char * name;
const char * value;
} FOO;
void ApiFunc(FOO const* args, unsigned count);
爲了填補這個參數,我需要循環一些其他的數據,並創建FOO在飛行中的條目。什麼是最優雅的方式來做到這一點?
下面的辦法似乎在第一個簡單的,但不工作(因爲字符串實例走出去的範圍和調用之前被破壞到ApiFunc()):
// Approach A: this does *not* work
std::vector<FOO> args;
for (...)
{
string name = ... // something which gets
string value = ... // calculated in the loop
args.push_back(FOO{name.c_str(), value.c_str()});
}
ApiFunc(args.data(), args.size());
把字符串對象中矢量(以防止它們被破壞)無法正常工作或 - 作爲投入的載體時,琴絃被複制,並與原有的仍然破壞:
// Approach B: this also does *not* work
std::vector<string> strings;
for (...)
{
string name = ... // something which gets
string value = ... // calculated in the loop
strings.push_back(name);
strings.push_back(value);
args.push_back(FOO{name.c_str(), value.c_str()});
}
ApiFunc(args.data(), args.size());
我可以防止通過創建字符串對象在堆上並使用auto_ptr來保持trac其中有k個,但是有更好的方法嗎?
// Approach C: this does work
std::vector<auto_ptr<string>> strings;
for (...)
{
string* name = new ...
string* value = new ...
strings.push_back(auto_ptr<string>(name));
strings.push_back(value);
args.push_back(FOO{name.c_str(), value.c_str()});
}
ApiFunc(args.data(), args.size());
雖然方法C.似乎工作,我覺得它很不明顯/難以理解。任何建議如何我可以改善它?
在一個不相關的紙幣,不與前導下劃線後跟大寫字母使用符號,[那些在所有範圍內保留(http://stackoverflow.com/questions/228783/what- 「實現」(編譯器和標準庫)是「關於使用下劃線的ac標識符」。 –
爲什麼你不能a)把'char *'設置爲'char [SOME_SIZE]',這樣你就可以複製字符串並完成它,或者b)如果字符串的最大尺寸不能被完成,動態地分配'name'''的值? –
另外,請勿使用'auto_ptr'。 –