使用const char *属性返回struct

时间:2014-12-15 14:46:18

标签: c++

在这个包装器方法中,我返回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*。没有这样的帮助,属性的指针将失去他们的引用,我得到假属性。 strcpy的示例:

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

如何在我的方法中实现这个?

1 个答案:

答案 0 :(得分:1)

你不应该在你的方法中实现它 - 相反,你应该在一个单独的函数中实现它,并在你需要复制字符串的所有地方使用它:

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