检查输入的有效性 - Setter 函数

Checking validity of input - Setter function

这是一个大学项目的练习题,目前正在学习面向对象编程,我对此比较陌生。

我有一个 class Publication,属性为 HeadlineText。 这是 class(头文件)

的代码
#include <iostream>
#include <string>

using namespace std;
using std::string;

class publication
{
    private:
        string headline,text;
    public:
        publication(); //constructor

        void set_headline(string const new_headline);
        void set_text(string const new_text);

        string get_headline();
        string get_text();

        void print();
}

这是实现(.cpp 文件)

#include <iostream>
#include <string>
#include "publication.h"

using namespace std;
using std::string;

publication::publication()
{
    publication.headline="";
    publication.text="";
}

void publication::set_headline(string const new_headline)
{
    publication.headline=new_headline; //any input is valid
}

void publication::set_text(string const new_text)
{
    publication.text=new_text; //any input is valid
}

string publication::get_headline()
{
    return publication.headline;
}

string publication::get_text()
{
    return publication.text;
}

到目前为止我没有发现任何问题,如果我错了请纠正我。

这是我的问题:

我需要定义一个名为 Article 的新 class。 ArticlePublication 的一种类型,因此它继承自 Publication,但它也有自己的唯一字段,称为 Author.

这里是Articleclass的代码(头文件)

#include <iostream>
#include <string>
#include "publication.h"

using namespace std;
using std::string;

class article: public publication
{
    private:
        string author;
    public:
        article();

        void set_author(string const new_author);

        string get_author();
}

这是实现(.cpp 文件)

#include <iostream>
#include <string>
#include "article.h"

using namespace std;
using std::string;

article::article()
{
    article.author="";
    article.set_headline("");
    article.set_text("");
}

void article::set_author(string const new_author)
{
    article.author=new_author;
}

string article::get_author()
{
    return article.author;
}

这是我的问题:

set_author 方法中,我想检查输入是否有效。据我所知,没有叫123的人,也没有叫Bob%^!@的人。有没有办法检查字符串是否包含非字母字符?

首先让我指出几个我发现的问题。

在您的 class 构造函数和设置器中,您不使用点分隔符为成员数据分配新值。

在你有 publication.headline=""; 的地方,你可以只做 headline = "";。这适用于您在自己的 class 中使用会员数据的所有情况,因此它也适用于您的 article class。

其次,在你的 article class 中。您为继承设置 .h 文件的方式是正确的;但是,在构造函数的 .cpp 中,您必须将 publication 构造函数扩展到 article 构造函数上,就像这样...

article::article() : publication()
{
    ....
}

: publication() 是对 super class 的构造函数的调用,没有它,headlinetext 数据成员将不会被初始化。

const 变量的常见做法也是以这种风格编写:const <data-type> <variable-name>,所以如果你有 string const new_author 或任何类似的东西,只需切换到 const string new_author.

现在,至于按照您所说的方式验证您的输入,您可以使用我想到的两种不同方法。一种是使用 isalpha() 方法,另一种是使用 ASCII table 来检查每个字符的值。

ASCII Method... simple iterator through each character and check if the values are between 65 and 90 or 97 and 122... (refer to ascii table 寻求帮助)。对于此示例,我将使用名为 name 的变量作为输入字符串变量。

for (int i = 0; i < strlen(name); i++)
{
    if ((int(name[i]) >= 65 && int(name[i]) <= 90) 
         || (int(name[i]) >= 97 && int(name[i]) <= 122))
    {
        ...the character is A-Z or a-z...
    }
}

函数方法...

for (int i = 0; i < strlen(name); i++)
{
    if (!(isalpha(name[i])))
    {
        ...the character is only A-Z or a-z...
    }
}

希望对您有所帮助!编程愉快!