降低句子不会使用单独的类

时间:2016-01-11 08:52:36

标签: c++ string class object tolower

我知道如何降低句子,但我想使用我的字符串修改类来这样做。出于某种原因,使用我的Strmod对象不起作用,而是通过主要工作来完成。这是降低代码的句子:

TL; DR,回答:结果我需要通过引用将字符串传递给对象!以下是有效的代码:

transform(statement.begin(), statement.end(), statement.begin(), tolower);

这是我的课程:

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
}

3 个答案:

答案 0 :(得分:0)

试试这个,它应该有用

string data = "";
getline(cin, data);
transform(data.begin(), data.end(), data.begin(), ::tolower);
cout<<data;

::指的是全局命名空间,而不是std::标准命名空间,否则你必须输入类似(int (*)(int))std::tolower的相关返回类型。您想将其引用到std命名空间

包括:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

答案 1 :(得分:0)

让我解释一下这个版本不起作用的区别。在工作中,您正在修改字符串statementcout,因此一切都按预期工作。但是,在不起作用的版本中,您调用方法lower并按值为其提供字符串statement。这意味着,该方法获得statement的副本。该方法适用于复制的版本并返回它。由于您没有捕获函数的返回值,因此您在main方法中引用的statement变量保持不变。它是通过值传递的,也就是说只有它的副本被发送到该方法。试试这个版本的非工作代码,看看它实际上是你想要完成的事情:

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;
    }
};

答案 2 :(得分:0)

这门课与你认为它不起作用的原因无关。问题与参数传递有关。您正在通过复制获取方法的字符串参数。

您会从独立功能中看到相同的结果。

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;
}

您可能不希望每次都实例化该类以调用该方法。如果是,请考虑制作方法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);