hpp文件:
#pragma once
#include <string>
using namespace std;
class LiczbaException: public exception{
private:
string s;
public:
LiczbaException(string ss) :
s(ss){
};
virtual ~ LiczbaException() throw () {
};
virtual const char * erorrr() const throw () {
return s.c_str();
}
};
class RzymArab {
private:
static string liczby[13];
static int arabliczby[13];
public:
static int rzym2arab (string rzym);
static string arab2rzym (int arab) throw(LiczbaException);
};
string RzymArab::liczby[13] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
int RzymArab::arabliczby[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
测试cpp:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "RzymArab.hpp"
using namespace std;
int main(int argc, char * argv[]) {
bool sprawdz = true;
int t = 0;
string pom;
for (int l = 1; l < argc; l++) {
try {
t = atoi(argv[l]);
if (t == 0)
throw pom;
else
sprawdz = true;
} catch (string pom){
sprawdz = false;
}
if (sprawdz == false){
try{
int wynikk = RzymArab::rzym2arab(argv[l]);
if (argv[l] != RzymArab::arab2rzym(wynikk))
cout << "Nieistniejaca liczba" << endl;
else
cout << wynikk << "\n";
} catch (LiczbaException& w) {
cout << w.what() << endl;
}
} else {
try {
string wynik = RzymArab::arab2rzym(t);
cout << wynik << "\n";
} catch (LiczbaException& w){
cout << w.what() << endl;
}
}
}
return 0;
}
cpp文件:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "RzymArab.hpp"
using namespace std;
class RzymArab
{
static int rzym2arab(string rzym) {
int wynik = 0;
for (int i = 0; i < rzym.length(); i++) {
int wart1 = 0;
int wart2 = 0;
for (int j = 0; j < 13; j++) {
if (rzym.at(i)==liczby[j].at(0)) {
wart1 = arabskie[j];
}
}
for (int k = 0; k < 13; k++) {
if (i<rzym.length()-1) {
if (rzym.at(i+1)==liczby[k].at(0))
wart2 = arabskie [k];
}
}
if (wart1 >= wart2) {
wynik+=wart1;
}else {
wynik+=(wart2 - wart1);
i = i + 1;
}
}
if (wynik > 3999)
cout << "Za duza liczba!";
if (wynik == 0)
cout << "Something get's wrong!";
return wynik;
}
static string arab2rzym(int arab) throw (LiczbaException) {
string wynik = "";
if (arab < 1 || arab > 3999)
throw LiczbaException("Zla podstawa");
for (int i = 0; i < 13; i++) {
while (arab >= arabskie[i]) {
wynik += liczby[i];
arab -= arabskie[i];
}
}
return wynik;
}
};
编译时出现错误:
“RzymArab.cpp:10:7:错误:'class RzymArab'的重新定义
RzymArab类
在包含的文件中,形式RzymArab.cpp:5:0:
RzymArab.hpp:26:7:错误:``类RzymArab''的先前定义
RzymArab类”
我不知道出什么问题了,也许一次有杂物,但是当我使用旧警卫时,一切都没有改变。
最佳答案
类别RzymArab
在正文(cpp)的 header (hpp)和中定义,这违反了one definition rule of C++(ODR)。
在主体中,删除类定义并按以下方式定义成员:
int RzymArab::rzym2arab(string rzym)
{
....
}
string RzymArab::arab2rzym(int arab) throw (LiczbaException)
{
....
}
此外,一旦多次包含 header ,在 header 中定义
RzymArab::liczby
和RzymArab::arabliczby
也会违反ODR。因此,也将这些定义移到 body 上。最后,don't import namespaces in a header file(使用 namespace xxx)。通常,头文件的用户希望其 namespace 不会由于包含头而受到污染。
PS:您想使用命名常量而不是幻数
13
。Exception specifications (
throw (xx)
)是C++的过时功能。从C++ 11开始,它们已被noexcept specifiers取代。异常规范已过时的原因之一是,通常很难确保只抛出指定的异常。如果违反了规范,则您的程序将默认使用terminate()
。