从用作数据部分的字符串派生的类

Posted

技术标签:

【中文标题】从用作数据部分的字符串派生的类【英文标题】:Class derived from string used as data section 【发布时间】:2017-05-13 09:12:07 【问题描述】:

我有一个任务,我必须“创建一个从字符串派生的名为 Number 的类。您将使用它作为基类来派生 Integer 和 Double 类。”它继续说来自 Integer 和 Double 类的数据部分将“消失”。

“因为 Number 是从字符串派生的,而 Integer 和 Double 是从 Number 派生的,所以它们都变成了字符串。这为您提供了一个内置的数据部分。”我不明白的是我的数据部分现在在哪里。我如何调用它并更改它。

"此时你的 Number 类将只包含以下代码:

-将数据部分设置为“0”的无参数构造函数

- 一个重载的构造函数,它接受一个字符串并将数据部分设置为传递给它的值。"

//Number class with the two constructors
#ifndef NUMBER
#define NUMBER

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

class Number: public string

public:
    Number() : string("0")  
    Number(string s) : string(s)  
;
#endif

双班

//Double class 
#ifndef DOUBLE
#define DOUBLE
#include <string>
#include "Integer.h"
#include "Number.h"
using std::string;
class Double: public Number

private:
    // do i call Number here? like Number data; or double data;?
    // or is the data not here?
    void isNan(string s);
    bool nan = false;
    void recursiveNaN(string::iterator p, string::iterator n);

public:
    // Constructors
    Double();
    Double(double d);
    Double(const Double &d);
    Double(const Integer &i);

    // Functionality
    void equals(double d);
    Double &equals(const Double &d);
    Double add(const Double &d);
    Double sub(const Double &d);
    Double mul(const Double &d);
    Double div(const Double &d);
    double toDouble() const;

    //Primitives
    Double add(double d);
    Double sub(double d);
    Double mul(double d);
    Double div(double d);

    // Operator Overload
    Double operator + (const Double &d);
    Double operator - (const Double &d);
    Double operator * (const Double &d);
    Double operator / (const Double &d);
    Double &operator = (const Double &d);
    bool operator == (const Double &d);
    bool operator == (double d);
    bool operator != (const Double &d);
    bool operator != (double d);

    //String stuff
    Double(string s);
    bool isNan();
    void equals(string s);
    Double &operator = (string s);
    string toString();
;



#endif // !DOUBLE

我们的一个提示是关于 void quals(double d) 函数。提示是将 d 转换为字符串,然后使用重载的字符串参数调用 equals 来分配 this->.

void Double::equals(double d)

    stringstream ss;
    ss << d;
    this->equals(ss);

void Double::equals(string s)

    this->isNan(s);
    if (!this->isNan())
        this->assign(s);
    else
        this->assign("0.0");

在我看来,这就是他的意思,但这给了我一个错误,即没有调用 equals 的成员函数。我只需要知道如何调用这些新数据以及如何更改它。 My Number 类也不能再有任何功能了。

【问题讨论】:

您应该注意,通常 c++ 标准库类不太适合继承它们,例如使用std::string 没有任何virtual 函数可以override,因此继承有点毫无意义。最好只使用内部std::string 成员变量。 谁会从字符串类派生一个数字类??! 是的,我不知道从字符串派生有多实用,但它是分配所必需的。 任何和所有帮助表示赞赏 "这给了我一个错误,即没有调用 equals 的成员函数"。您为什么不向我们展示您遇到的实际错误?这可能是许多事情中的任何一个。 【参考方案1】:

我不明白我的数据部分现在在哪里。我如何调用它并更改它。

你没有。数字是字符串,因为您是从字符串派生的。你想要什么额外的数据?您可以通过调用std::string 的任何成员函数或将您的类的实例传递给任何接受std::string(或对其中的引用)的函数来调用它。

【讨论】:

以上是关于从用作数据部分的字符串派生的类的主要内容,如果未能解决你的问题,请参考以下文章

如何派生抽象模板类,模板类型作为函数参数 (C++11)

从字符串集派生 RegExp

strtotime 在将值用作硬编码字符串时不返回值

在SSIS派生列Expression中删除字符串的一部分

带有 toString() 的类可以用作字符串,但是如何说服 TypeScript 编译器呢?

如何将 EntityData 派生类默认字符串 Id 属性的主键更改为 int 属性?