【问题标题】:How do i make a header file for this code? [duplicate]我如何为这段代码制作头文件? [复制]
【发布时间】:2014-10-28 08:10:40
【问题描述】:

我需要为此代码创建一个头文件。

#include "iostream"
using namespace std;
#include <string>
#include <vector>
#include <algorithm>

class persoana {
private:
    string nume;
    int an_nastere;
    char sex;

public:
    persoana() {
        string nume;
        cout << "Nume: ";
        cin.ignore();
        getline(cin, nume);
        set_nume(nume);
        int an_nastere;
        cout << "An nastere: ";
        cin >> an_nastere;
        set_an_nastere(an_nastere);
        char sex;
        cout << "Sex: ";
        cin >> sex;
        set_sex(sex);
    }
    ~persoana() {}

    string get_nume() const { return nume; }
    void set_nume(string nume_nou) {
        if (nume != nume_nou) {
            nume = nume_nou.c_str();
        }
    }
    int get_an_nastere() const { return an_nastere; }
    void set_an_nastere(int an_nastere_nou) {
        if (an_nastere != an_nastere_nou)
            an_nastere = an_nastere_nou;
    }
    char get_sex() const { return sex; }
    void set_sex(char sex_nou) {
        if (sex != sex_nou)
            sex = sex_nou;
    }
};

ostream& operator<<(ostream& out, const persoana& p) {
    return out << p.get_nume() << " - " << p.get_an_nastere() << " - "
               << p.get_sex() << endl;
}

bool dupa_nume(persoana* p1, persoana* p2) {
    return (p1->get_nume() < p2->get_nume());
}
bool dupa_varsta(persoana* p1, persoana* p2) {
    return (p1->get_an_nastere() > p2->get_an_nastere());
}

class baza_de_date {
private:
    vector<persoana*> vector_persoane;
    int n;

public:
    baza_de_date(){};
    baza_de_date(int dim) {
        if (dim > 0) {
            n = dim;
            vector_persoane.reserve(n);
        }
    }
    ~baza_de_date() {
        for (int i = 0; i < vector_persoane.size(); i++)
            delete vector_persoane[i];
        vector_persoane.clear();
    }
    void inserare() { vector_persoane.push_back(new persoana()); }
    void afisare() {
        for (int i = 0; i < vector_persoane.size(); i++)
            cout << *vector_persoane[i];
    }
    void eliminare(string nume) {

        vector<persoana*>::iterator it;
        for (it = vector_persoane.begin(); it != vector_persoane.end();) {
            if ((*it)->get_nume() == nume) {
                delete *it;
                it = vector_persoane.erase(it);
            } else
                ++it;
        }
    }
    void eliminare(int an_nastere) {
        vector<persoana*>::iterator it;
        for (it = vector_persoane.begin(); it != vector_persoane.end();) {
            if ((*it)->get_an_nastere() == an_nastere)
                it = vector_persoane.erase(it);
            else
                ++it;
        }
    }
    void eliminare(char sex) {
        vector<persoana*>::iterator it;
        for (it = vector_persoane.begin(); it != vector_persoane.end();) {
            if ((*it)->get_sex() == sex)
                it = vector_persoane.erase(it);
            else
                ++it;
        }
    }
    void sortare_dupa_nume() {
        sort(vector_persoane.begin(), vector_persoane.end(), dupa_nume);
    }
    void sortare_dupa_varsta() {
        sort(vector_persoane.begin(), vector_persoane.end(), dupa_varsta);
    }
};

int main() {
    baza_de_date bd;
    int o;
    do {
        system("cls");
        bd.afisare();
        cout << "\n1.Adauga persoana\n2.Elimina persoana dupa nume\n3.Elimina "
                "persoana dupa anul nasterii\n4.Elimina persoana dupa "
                "sex\n5.Afiseaza dupa nume\n6.Afiseaza dupa "
                "varsta\n0.Iesire\nOptiunea: ";
        cin >> o;
        switch (o) {
            case 1: {
                bd.inserare();
            } break;

            case 2: {
                string nume;
                cout << "Nume: ";
                cin.ignore();
                getline(cin, nume);
                bd.eliminare(nume);
            } break;

            case 3: {
                int an_nastere;
                cout << "An nastere: ";
                cin >> an_nastere;
                bd.eliminare(an_nastere);
            } break;

            case 4: {
                char sex;
                cout << "Sex: ";
                cin >> sex;
                bd.eliminare(sex);
            } break;

            case 5: {
                bd.sortare_dupa_nume();
            } break;

            case 6: {
                bd.sortare_dupa_varsta();
            } break;
        }
    } while (o);

    return 0;
}

【问题讨论】:

  • 嗨。欢迎来到堆栈溢出。当您只想知道如何为类创建标题时,将您的整个代码转储给我们只是噪音,很可能会吸引反对票和接近投票。您的问题是否需要所有这些代码?不,您应该发布一个由虚拟类和一个虚拟函数组成的最小代码,然后您应该将答案推断为您的真实代码。看到@BrianCain 给你的答案了吗?只是代表他的观点所需的最少代码。您的问题应该类似。

标签: c++


【解决方案1】:

您必须将类的实现与其接口分开。该过程类似于使用 C 完成的过程,但增加了一点复杂性。

简而言之,只要有一对花括号,你就需要一个分号。您还必须将源转换为适当限定。

这是要遵循的模式。考虑每个标头/源对一个类,但这不是一个固定的规则。

标题:

class baza_de_date
{
private:
vector<persoana*> vector_persoane;
int n;
public:
baza_de_date();
baza_de_date(int dim);
// ...
};

来源:

#include "baza.h"

baza_de_date::baza_de_date(int dim)
{                    
    if (dim>0)
    {
        n=dim;
        vector_persoane.reserve(n);
    }
}

【讨论】:

  • 分离代码定义 (cpp) 和声明 (.h) 不是“必须做”的语言,但出于各种原因,它是一种更可取的语言。
  • @user3791372,上下文是“我需要为此代码创建一个头文件”,所以答案是“[为了做到这一点]您必须将 ... 实现与其接口分开” .
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 2018-08-21
  • 2022-08-15
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多