提问人: 提问时间:6/1/2022 更新时间:6/6/2022 访问量:518
C++ 使用默认值通过引用传递非常量字符串
C++ pass a non const string by reference with default value
问:
所以我正在研究一个代码库,其中在很多地方调用了这个 someFunc,我无法通过在调用此函数的所有地方添加这个新变量来更改它。当根本不需要该变量时,调用 someFunc 的地方也是如此。
所以我有一个要求,我需要有一个函数定义,其中包含一个通过引用传递的字符串,并且我们能够改变相同的值。
- 按引用传递:因为调用方使用该字符串变量
- 默认值:因为这个函数是在很多地方调用的,所以不能到处都改变。
- Non const :因为我想改变它
这是我尝试过的:
ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, const string &d = "")
这种方法的问题是我无法在我的函数中更改 d 的值。出现以下错误:
如何使用满足我要求的东西?
答:
-1赞
Mohammad Rifat Arefin
6/1/2022
#1
如果要更改字符串,为什么要使用。试试这个版本:const
ExceptionClass ClassName::someFunc(int a, float b, map<int, string> c, string &d)
评论
2赞
6/1/2022
那么默认值呢?给它默认值的主要目的是这个函数在很多地方被调用,我不想在调用它的所有地方添加一个新变量。顺便说一句,我没有投反对票
0赞
Mohammad Rifat Arefin
6/1/2022
你没有提到默认值是你的要求
2赞
fabian
6/1/2022
@MohammadRifatArefin 在标题中“隐藏”此类信息不是一个好习惯,但信息就在那里:“C++使用默认值和非常量通过引用传递字符串”
0赞
Mohammad Rifat Arefin
6/1/2022
对不起,我没有看到标题,完全是我的错!
1赞
user4442671
6/1/2022
#2
您可以使用单独的重载而不是默认值来获取所描述的等效行为:
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);
}
};
0赞
Goswin von Brederlow
6/1/2022
#3
将 “” 指定为默认参数是没有意义的。如果您正在修改参数,那么这些更改似乎具有一些值,并且字符串文本会丢失这些值。
我能想到两种有意义的方法:
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 个参数?
评论
0赞
6/1/2022
One with 3 and one with 4 arguments
仅实现了这一点 RN,但您的第一种方法的问题是该变量将永远保留在内存中,直到进程关闭
评论
d
d
c
someFunc
ExceptionClass someFunc(int a, float b, map<int, string> c) { std::string defaultVal = ""; return someFunc(a, b, std::move(c), defaultValue);}