试图在类上重载赋值运算符。

时间:2018-02-19 03:52:02

标签: c++

HOMEWORK

以下是我为家庭作业创作的所有代码。我被困在作业的最后一部分。

分配: 以下是他给我们的代码来测试我们的工作。

int main()
{
   roman r1 = 1234;
   roman r2 = "DLXVII"; // 567
   roman r3 = r1 + r2;

   cout << r1 << " + " << r2 << " = " << r3;

   cin.get();
}

Produces the following output:

MCCXXXIV + DLXVII = MDCCCI

以下是我编写的代码。

#include <iostream>
#include <string>

using namespace std;

class roman {
public:
    string numR;
    int numI;

    string romanConversion(int input) {
        string m[] = { "", "M", "MM", "MMM" };
        string c[] = { "", "C", "CC", "CCC", "CD", "D",
                        "DC", "DCC", "DCCC", "CM" };
        string x[] = { "", "X", "XX", "XXX", "XL", "L",
                        "LX", "LXX", "LXXX", "XC" };
        string i[] = { "", "I", "II", "III", "VI", "V",
                        "VI", "VII", "VIII", "IX" };

        string thousands = m[input / 1000];
        string hundreds = c[(input % 1000) / 100];
        string tens = x[(input % 100) / 10];
        string ones = i[input % 10];

        string answer = thousands + hundreds + tens + ones;
        return answer;
    }
    int value(char r)
    {
        if (r == 'I')
            return 1;
        if (r == 'V')
            return 5;
        if (r == 'X')
            return 10;
        if (r == 'L')
            return 50;
        if (r == 'C')
            return 100;
        if (r == 'D')
            return 500;
        if (r == 'M')
            return 1000;

        return -1;
    }
    int romanToDecimal(string &str)
    {
        int result = 0;
        for (int i = 0; i<str.length(); i++)
        {
            int s1 = value(str[i]);

            if (i + 1 < str.length())
            {
                int s2 = value(str[i + 1]);
                if (s1 >= s2)
                {
                    result = result + s1;
                }
                else
                {
                    result = result + s2 - s1;
                    i++; 
                }
            }
            else
            {
                result = result + s1;
                i++;
            }
        }
        return result;
    }
};

int main() {
    roman test = roman();
    int input = 3999;
    cout << test.romanConversion(input) << endl;
    string roman = "MMMCMXCIX";
    cout << test.romanToDecimal(roman) << endl;
    cin.get();


}

我们一直在最后一小部分工作的最后一小时工作,它正在重载赋值运算符,因此我们可以直接分配整数和“罗马数字”,然后对它们执行方程等。

我们尝试了几种尝试重载=方法的不同方法,但在提交“字符串”时遇到错误 这是“没有合适的构造函数可以从”const char“转换为roman。

任何指导都非常适合创建赋值运算符。

1 个答案:

答案 0 :(得分:1)

这看起来像一个有趣的任务。编译器不满意你没有接受整数和字符数组的罗马类的构造函数,它不知道如何添加两个类型为&#39; roman&#39;在一起,并且它不知道如何输出罗马式的对象。检查下面插入的代码,看看我写的//你填写的地方

#include <iostream>
#include <string>

using namespace std;

class roman {
public:
    string numR;
    int numI;

    roman(int)
    {
       // you fill in stuff here
    }
    roman(const char *)
    {
       // you fill in stuff here
    }

    roman operator+(const roman &rhs)
    {
       // you fill in stuff here
    }

    string romanConversion(int input) {
        string m[] = { "", "M", "MM", "MMM" };
        string c[] = { "", "C", "CC", "CCC", "CD", "D",
                        "DC", "DCC", "DCCC", "CM" };
        string x[] = { "", "X", "XX", "XXX", "XL", "L",
                        "LX", "LXX", "LXXX", "XC" };
        string i[] = { "", "I", "II", "III", "VI", "V",
                        "VI", "VII", "VIII", "IX" };

        string thousands = m[input / 1000];
        string hundreds = c[(input % 1000) / 100];
        string tens = x[(input % 100) / 10];
        string ones = i[input % 10];

        string answer = thousands + hundreds + tens + ones;
        return answer;
    }
    int value(char r)
    {
        if (r == 'I')
            return 1;
        if (r == 'V')
            return 5;
        if (r == 'X')
            return 10;
        if (r == 'L')
            return 50;
        if (r == 'C')
            return 100;
        if (r == 'D')
            return 500;
        if (r == 'M')
            return 1000;

        return -1;
    }
    int romanToDecimal(string &str)
    {
        int result = 0;
        for (int i = 0; i<str.length(); i++)
        {
            int s1 = value(str[i]);

            if (i + 1 < str.length())
            {
                int s2 = value(str[i + 1]);
                if (s1 >= s2)
                {
                    result = result + s1;
                }
                else
                {
                    result = result + s2 - s1;
                    i++; 
                }
            }
            else
            {
                result = result + s1;
                i++;
            }
        }
        return result;
    }
};

ostream& operator<<(ostream& os, const roman &)
{
   // you fill in stuff here
   return os;
}

int main()
{
   roman r1 = 1234;
   roman r2 = "DLXVII"; // 567
   roman r3 = r1 + r2;

   cout << r1 << " + " << r2 << " = " << r3;

   cin.get();
}