c++ - 返回具有 const char* 属性的结构

标签 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*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;
}

关于c++ - 返回具有 const char* 属性的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27486603/

相关文章:

c++ - 如何组合两个具有相同代码的模板函数?

c++ - 在 C++ 中签署 aChar 时出现内存泄漏?

c++ - 如何区分函数参数中的左值和右值引用

c++ - 无意中修改了我的对象的拷贝

c++ - 类的重新定义

c++ - 在索引和值类型上参数化的惯用 vector 类型

c++ - 多线程同步

c++ - 抽象基类中的析构函数保护在C++中不被继承?

c++ - 无法在 map 的 map 的 STL map 中插入数据

c++ - !(variable) 和 (!variable) 之间的区别