使用单独的 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;

让我解释一下不起作用和起作用的版本之间的区别。在工作中,您正在修改字符串 statementcout'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);