使用单独的 class 降低句子不起作用
Lowering a sentence doesn't work using a separate class
我知道如何降低句子,但我想使用我的字符串修改 class 来做到这一点。出于某种原因,使用我的 Strmod 对象不起作用,但通过主要工作来完成。下面是降句代码:
TL;DR,答案:原来我需要通过引用将字符串传递给对象!以下是有效的代码:
transform(statement.begin(), statement.end(), statement.begin(), tolower);
这是我的 class:
class Strmod {
public:
string lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
我这样称呼它:
int main(){
string statement = "";
getline(cin, statement);
Strmod mod;
mod.lower(statement);
cout << statement; //for debugging
}
试试这个,它应该有效
string data = "";
getline(cin, data);
transform(data.begin(), data.end(), data.begin(), ::tolower);
cout<<data;
::
指的是全局命名空间而不是 std::
标准命名空间,否则您必须将其类型转换为相关的 return 类型,例如 (int (*)(int))std::tolower
如果你想将它引用到 std
命名空间
包括:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
让我解释一下不起作用和起作用的版本之间的区别。在工作中,您正在修改字符串 statement
和 cout
'ing 它,所以一切都按预期工作。但是,在不起作用的版本中,您调用方法 lower
并按值向其提供字符串 statement
。这意味着,该方法获取 statement
的副本。该方法适用于复制的版本并 returns 它。由于您没有捕获函数的 return ,因此您在 main 方法中引用的 statement
变量保持不变。它是按值传递的,也就是说只有它的一个副本被发送到方法。试试这个版本的 non-working 代码,看看它是否确实完成了您想要完成的事情:
int main(){
string statement = "";
getline(cin, statement);
Strmod mod;
statement = mod.lower(statement); // see we are assigning the modified value to statement in order to capture the changed string
cout << statement; //for debugging
}
或者这个,你的方法的签名被更改为允许通过引用传递:
class Strmod {
public:
string lower(string &s) { // see the signature of the method changed for reference passing
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
class 与您认为它不起作用的原因无关。问题与参数传递有关。您正在通过复制获取方法的字符串参数。
您会看到独立函数的相同结果。
string lower(string s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
string s = "TEST";
lower(s);
std::cout << s; //still "TEST"
解决方法是引用传递。
请注意,我也返回了一个引用,以允许嵌套函数调用。
string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
您可能不想每次都实例化 class 来调用该方法。如果是这样,请考虑制作方法 static
。
struct Strmod {
static string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
string s = "TEST";
Strmod::lower(s);
但是您可能正在寻找的语言功能是 namespace。
namespace Strmod {
string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
string s = "TEST";
Strmod::lower(s);
我知道如何降低句子,但我想使用我的字符串修改 class 来做到这一点。出于某种原因,使用我的 Strmod 对象不起作用,但通过主要工作来完成。下面是降句代码:
TL;DR,答案:原来我需要通过引用将字符串传递给对象!以下是有效的代码:
transform(statement.begin(), statement.end(), statement.begin(), tolower);
这是我的 class:
class Strmod {
public:
string lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
我这样称呼它:
int main(){
string statement = "";
getline(cin, statement);
Strmod mod;
mod.lower(statement);
cout << statement; //for debugging
}
试试这个,它应该有效
string data = "";
getline(cin, data);
transform(data.begin(), data.end(), data.begin(), ::tolower);
cout<<data;
::
指的是全局命名空间而不是 std::
标准命名空间,否则您必须将其类型转换为相关的 return 类型,例如 (int (*)(int))std::tolower
如果你想将它引用到 std
命名空间
包括:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
让我解释一下不起作用和起作用的版本之间的区别。在工作中,您正在修改字符串 statement
和 cout
'ing 它,所以一切都按预期工作。但是,在不起作用的版本中,您调用方法 lower
并按值向其提供字符串 statement
。这意味着,该方法获取 statement
的副本。该方法适用于复制的版本并 returns 它。由于您没有捕获函数的 return ,因此您在 main 方法中引用的 statement
变量保持不变。它是按值传递的,也就是说只有它的一个副本被发送到方法。试试这个版本的 non-working 代码,看看它是否确实完成了您想要完成的事情:
int main(){
string statement = "";
getline(cin, statement);
Strmod mod;
statement = mod.lower(statement); // see we are assigning the modified value to statement in order to capture the changed string
cout << statement; //for debugging
}
或者这个,你的方法的签名被更改为允许通过引用传递:
class Strmod {
public:
string lower(string &s) { // see the signature of the method changed for reference passing
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
class 与您认为它不起作用的原因无关。问题与参数传递有关。您正在通过复制获取方法的字符串参数。
您会看到独立函数的相同结果。
string lower(string s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
string s = "TEST";
lower(s);
std::cout << s; //still "TEST"
解决方法是引用传递。
请注意,我也返回了一个引用,以允许嵌套函数调用。
string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
您可能不想每次都实例化 class 来调用该方法。如果是这样,请考虑制作方法 static
。
struct Strmod {
static string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
string s = "TEST";
Strmod::lower(s);
但是您可能正在寻找的语言功能是 namespace。
namespace Strmod {
string& lower(string &s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
};
string s = "TEST";
Strmod::lower(s);