首先,我是C ++编码的初学者,所以如果可能的话,尝试用最简单的术语解释事情,这样我就可以做出正面或反面。
我做了很多研究,但大多数例子对我没有任何意义。我尝试过实现各种解决方案,但我要么得到同样的错误,要么让事情变得更糟。
该程序应该能够接受一串罗马数字,并将它们转换为整数值。由于这是一项家庭作业,我必须在Roman_int
类中完成所有这一切,并通过班级中的成员函数执行操作。
我创建的程序包含一个名为as_int()
的成员函数,它将一串罗马数字转换为数字整数值。据我所知,这部分工作正常。
另外需要注意的是,我正在使用我大学提供的特殊标题,它处理诸如使用std库之类的东西,所以事情可能看起来有点奇怪。
以下是我所拥有的:
#include "std_lib_facilities_4.h"
/*
M=1000
D=500
C=100
L=50
X=10
V=5
I=1
*/
class Roman_int
{
string r;
public:
int as_int()
{
int val;
for(int i=r.size()-1; i>0; --i)
{
if(i==r.size()-1)
{
switch(r[i])
{
case 'M':
val+=1000;
break;
case 'D':
val+=500;
break;
case 'C':
val+=100;
break;
case 'L':
val+=50;
break;
case 'X':
val+=10;
break;
case 'V':
val+=5;
break;
case 'I':
val+=1;
break;
default:
error("invalid input");
break;
}
}
else
{
switch(r[i])
{
case 'M':
val+=1000;
break;
case 'D':
if(r[i+1]== 'M')
val-=500;
else
val+=500;
break;
case 'C':
if(r[i+1]== 'M' || r[i+1]== 'D')
val-=100;
else
val+=100;
break;
case 'L':
if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C')
val-=50;
else
val+=50;
break;
case 'X':
if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C' || r[i+1]== 'L')
val-=10;
else
val+=10;
break;
case 'V':
if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C' || r[i+1]== 'L' || r[i+1]== 'X')
val-=5;
else
val+=5;
break;
case 'I':
if(r[i+1]== 'I')
val+=1;
else
val-=1;
break;
default:
error("invalid input");
break;
}
}
}
return val;
}
friend istream& operator>>(istream& is, Roman_int& roman)
{
string rom_num;
is >> rom_num;
if(!is) return is;
roman = Roman_int(rom_num);
return is;
}
friend ostream& operator<<(ostream& os, Roman_int& roman)
{
cout << roman.r << endl;
return os;
}
};
int main()
{
Roman_int r;
cout << "Enter a Roman numeral in all capital letters: " << endl;
cin >> r;
cout << "Roman " << r << " equals " << r.as_int() << endl;
}
我遇到的问题是在我的main函数中声明我的Roman_int对象。我之前遇到了类似的错误:
hw6_pr3.cpp: In function ‘std::istream& operator>>(std::istream&, Roman_int&)’:
hw6_pr3.cpp:114:28: error: no matching function for call to ‘Roman_int::Roman_int(String&)’
roman = Roman_int(rom_num);
^
hw6_pr3.cpp:114:28: note: candidates are:
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int()
class Roman_int
^
hw6_pr3.cpp:17:7: note: candidate expects 0 arguments, 1 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(const Roman_int&)
hw6_pr3.cpp:17:7: note: no known conversion for argument 1 from ‘String’ to ‘const Roman_int&’
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(Roman_int&&)
hw6_pr3.cpp:17:7: note: no known conversion for argument 1 from ‘String’ to ‘Roman_int&&’
根据我的阅读,我非常确定它与默认构造函数或我的类是如何初始化有关,但我不知道我应该从哪里去,因为我从来没有遇到过我创建的任何类的这类问题。如果有人能用简单的术语解释这一点,那将非常有帮助。
编辑:我在Roman_int
类中添加了一个构造函数:
Roman_int(const string& r) : r(r) {}
但是我在主函数中调用Roman_int r;
时仍然出错。这是新的错误消息:
hw6_pr3.cpp: In function ‘int main()’:
hw6_pr3.cpp:131:12: error: no matching function for call to ‘Roman_int::Roman_int()’
Roman_int r;
^
hw6_pr3.cpp:131:12: note: candidates are:
hw6_pr3.cpp:124:2: note: Roman_int::Roman_int(const String&)
Roman_int(const string& r) : r(r) { }
^
hw6_pr3.cpp:124:2: note: candidate expects 1 argument, 0 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(const Roman_int&)
class Roman_int
^
hw6_pr3.cpp:17:7: note: candidate expects 1 argument, 0 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(Roman_int&&)
hw6_pr3.cpp:17:7: note: candidate expects 1 argument, 0 provided
答案 0 :(得分:2)
string rom_num;
roman = Roman_int(rom_num);
这需要在某处实现Roman_int::Roman_int(const std::string& argument)
。您正在调用一个对于该类不存在的构造函数。
在定义中实现它:
Roman_int(const std::string& r) : r(r) { }