C++ 通过引用传递具有默认值和非 const 的字符串

C++ pass a string by reference with default value and non const

所以我正在处理一个代码库,在这个代码库中,这个 someFunc 在很多地方被调用,我无法通过在调用这个函数的所有地方添加这个新变量来改变它。当在调用 someFunc 的所有地方都不需要该变量时也是如此。

所以我有一个要求,我需要一个函数定义,其中包含一个通过引用传递的字符串,并且我们能够改变相同的值。

这是我试过的:

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, const string &d = "")

这种方法的问题是我无法在我的函数中更改 d 的值。出现以下错误:

如何使用满足我要求的东西?

如果要改变字符串,为什么要使用 const。试试这个版本:

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, string &d)

您可以通过使用单独的重载而不是默认值来获得您所描述的等效行为:

class ClassName {
public:
  ExceptionClass someFunc(int a, float b, map<int, string> c, string &d);
  ExceptionClass someFunc(int a, float b, map<int, string> c) {
    string d = "";
    return someFunc(a, b, c, d);
  }
};

将“”指定为默认参数毫无意义。如果您正在修改参数,那么这些更改似乎有一些价值,并且会随着字符串文字而丢失。

我能想到两种可行的方法:

static string someFuncDefault = "";
ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, string &d = someFuncDefault);

ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, optional<reference_wrapper<string>> d_opt = {});

第一种情况会有一个跨函数调用的默认参数。因此一次调用的修改将更改下一次调用的默认使用。

第二个使字符串可选,但在某种程度上,代码可以检查它是否已通过并相应地运行。如果没有传递,则修改字符串毫无意义。

但说真的,你为什么没有两个功能呢?一个有 3 个参数,一个有 4 个参数?

您还可以使用接受默认空字符串的字符串指针。

class ClassName {
public:
  ExceptionClass someFunc(int a, float b, map<int, string> c, string *d = new string());
  }
};

无论你在哪里调用这个函数,你都可以传递你的字符串变量的地址

string d = getD();
yourObj.someFunc(a, b, c, &d);

您的函数定义随后可以使用 * 运算符取消引用指针变量。

ExceptionClass ClassName ::someFunc(int a, float b, map<int, string> c, string *d)
{
    *d = doSomething();
}