将字符串变量而不是固定字符数组传递给函数时出现编译问题

Compilation issue when passing a string variable to a function instead of a fixed character array

本文关键字:函数 问题 编译 数组 变量 字符串 字符      更新时间:2023-10-16

我正在为我的类构造函数使用初始化列表方法。我通过调用datareregistry类的getData成员函数来初始化变量,该函数提供要加载到类变量中的数据。getData方法通常通过传递一个字符数组来调用,其中包含要加载的数据的名称。

例如,初始化列表如下所示:

    dataItem1(dr.getData("Pop.Stats1")),
    dataItem2(dr.getData("Pop.Stats2"))

但是,由于提供名称的方式,我需要从用户类中提取数据集的名称,然后附加变量名称以传递给getData方法。像这样:

    datasetName(user.getAttributeString("DataSetName")),
    dataItem1(dr.getData(datasetName + ".Stats1")),
    dataItem2(dr.getData(datasetName + ".Stats2"))

其中datasetName定义为std::string变量

但是,这会抛出以下错误:
     no matching function for call to 'DataRegistry::GetData(std::basic_string<char,std::char_traits<char>, std::allocator<char> >)'

因为getData方法的实现没有提供给我,我知道当我只是传递一个字符数组(例如"Pop.Stat1")给函数时它是有效的,我怀疑这是因为函数只接受字符数组。所以,我试了:

    datasetName(user.getAttributeString("DataSetName")),
    dataItem1(dr.getData(strcat(datasetName.c_str() , ".Stats1"))),
    dataItem2(dr.getData(strcat(datasetName.c_str() , ".Stats2"))),

但是这会抛出错误:

    error: invalid conversion from 'const char*' to 'char*'
    initializing argument 1 of 'char* strcat(char*, const char*)'

我不知道出了什么问题?请建议!

几乎,尽管在c_str()的返回值上使用strcat会导致未定义的行为。只做:

(datasetName + ".Stats1").c_str()

所以整行看起来像

dataItem1(dr.getData((datasetName + ".Stats1").c_str())),

因为你是通过string::operator+".Stats1"连接到datasetName,然后你想让const char*到那个字符串,所以你在operator+的返回值上使用c_str()

你需要用圆括号把它括起来,因为.+有更高的优先级,所以如果父级不在那里,你会调用c_str() on "。Stats1"(代替+的返回值),它不存在。

如果datasetName是一个std::string,那么datasetName + "str"的类型也是std::string,所以你需要c_str()来获得const char*

dataItem1(dr.getData( (datasetName + ".Stats1").c_str() )),
dataItem2(dr.getData( (datasetName + ".Stats2").c_str() )

但是,在getData返回后,(datasetName + ".Stats1").c_str()的值被释放,因此确保getData复制char数组的内容。

datasetName.c_str()返回一个const char *——也就是说,你不能修改它——它是一个指向std::string内部数据的指针

此外……即使它只是一个char *,你也不能把数据附加到它的末尾,然后称之为好——你没有为它分配的内存。

追加std::string,然后调用c_str()

错误信息很清楚。方法c_str返回const char*,但strcat的第一个形参是char*。