繁体   English   中英

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

[英]C++ pass a non const string by reference with default value

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

所以我有一个要求,我需要有一个 function 定义,它有一个通过引用传递的字符串,我们能够改变相同的值。

  • 通过引用传递:因为那个字符串变量被调用者使用
  • 默认值:因为这个函数在很多地方被调用,不能到处改变。
  • 非 const:因为我想改变它

这是我试过的:

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

这种方法的问题是我无法更改 function 中 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 = {});

第一种情况将有一个跨函数调用持续存在的默认参数。 因此,一次调用的修改将更改下一次调用的默认用途。

第二个使字符串是可选的,但在某种程度上,代码可以检查它是否被传递并相应地表现。 如果没有传递字符串,则没有必要修改字符串。

但实际上,为什么你没有 2 个功能? 一个有 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();
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM