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;
}
};
我在编译时遇到错误: &#34; RzymArab.cpp:10:7:错误:重新定义了类RzymArab&#39; RzymArab类
包含在文件中的RzymArab.cpp:5:0: RzymArab.hpp:26:7:错误:以前定义的&#39;类RzymArab&#39; RzymArab等级#34;
我不知道出了什么问题,或许曾经有过pragma的东西,但是当我使用旧护卫时没有任何改变。
答案 0 :(得分:2)
类RzymArab
在主体(cpp)的标题(hpp)和中定义,这违反了one definition rule of C++(ODR)。
在正文中,删除类定义并按如下方式定义成员:
int RzymArab::rzym2arab(string rzym)
{
....
}
string RzymArab::arab2rzym(int arab) throw (LiczbaException)
{
....
}
此外,一旦标题包含多次,标题中定义RzymArab::liczby
和RzymArab::arabliczby
也会违反ODR。所以,也要将这些定义移到正文中。
最后,don't import namespaces in a header file(使用命名空间xxx)。通常,头文件的用户希望通过包含标头来防止其名称空间被污染。
PS:您想使用命名常量而不是幻数13
。
Exception specifications (throw (xx)
)是C ++的一个过时功能。从C ++ 11开始,它们被noexcept specifiers取代了。异常规范已经过时的一个原因是通常很难确保只抛出指定的异常。如果违反了规范,您的程序将默认为terminate()
。