簡體   English   中英

返回帶有const char *屬性的struct

[英]Returning struct with const char* property

在此包裝方法中,我返回DN_OPstruct ,它具有兩個const char*屬性: TargetNode_IdentifierName 對於p/invoke ,我必須使用const char* -類型, std::string不起作用:

DN_OPstruct getDnOperationIntern(const char* charGuid){
    DN_OPstruct op;
    UA_OPstruct _op;     
    _op = GetOPData(charGuid);
    op.direction = _op.direction;
    op.Name = _op.Name.toUtf8(); 
    op.TargetNode_Identifier = _op.TargetNode_Identifier.toUtf8();
    op.TargetNode_NamespaceIndex = _op.TargetNode_NamespaceIndex;
    op.Type_of_OP = _op.Type_of_OP;
    return op ;
}

如我所讀,您必須strcpy const char* s。 沒有這種幫助,屬性的指針將失去其引用,並且我得到錯誤的屬性。 strcpy的示例:

strcpy(new char[output.size()], output.c_str());

如何在我的方法中實現呢?

您不應該在方法中實現它-相反,您應該在單獨的函數中實現它,並在需要復制字符串的所有地方使用它:

char *copyCString(const string& s) {
    char *res = new char[s.size()+1]; // Add 1 for null terminator
    strcpy(res, s.c_str());
    return res;
}

現在,您可以根據需要使用此功能制作副本:

op.Name = copyCString(_op.Name); 
op.TargetNode_Identifier = copyCString(_op.TargetNode_Identifier);

您也可以從const char*開始:

char *copyString(const char* s) {
    char *res = new char[strlen(s)+1]; // Add 1 for null terminator
    strcpy(res, s);
    return res;
}

現在,您可以這樣稱呼它:

op.Name = copyString(_op.Name.toUtf8()); 
op.TargetNode_Identifier = copyString(_op.TargetNode_Identifier.toUtf8());

當然,您有責任在完成后刪除副本:

delete[] op.Name;
delete[] op.TargetNode_Identifier;

同樣,為此定義一個函數也是一個好主意:

void freeCopiedString(char *s) {
    delete[] s;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM