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::liczbyRzymArab::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()

08-15 23:31