班里面的班级?

时间:2014-04-20 16:44:27

标签: c++ class struct enums nested

我正在尝试将此代码从使用结构转换为使用类。我遇到的问题是,我不知道如何声明,初始化等类,以便它们以与下面发布的代码相同的方式工作。我必须为每个类使用单独的文件(即class1.h,class1.cpp,class2.h,class2.cpp,main.cpp),我不知道如何实现与结构相同的效果。我怎样才能在类中嵌套一个类?

我的另一个问题是,我应该如何处理枚举列表?何时何地宣布/初始化它们?

非常感谢!希望我很清楚..我试过谷歌搜索它,但我发现没有什么有用的。

以下是代码:

#include <iostream>
#include <string>
using namespace std;

enum TIP_NASLOVA {
    STALNI,
    ZACASNI
};

struct Naslov {
    string ulica;
    string posta;
    int postna_stevilka;
    TIP_NASLOVA tip;
};

struct Oseba {
    string ime;
    string priimek;
    int starost;
    Naslov naslov;
};

void izpis(Oseba oseba) {
    cout << "IZPIS VNOSA" << endl << endl;
    cout << "Ime: " << oseba.ime << endl;
    cout << "Priimek: " << oseba.priimek << endl;
    cout << "Starost: " << oseba.starost << endl;
    cout << "Tip Naslova: ";
            if (oseba.naslov.tip==0){
               cout << "STALNI" << endl;
            }
            else if (oseba.naslov.tip==1){
               cout << "ZACASNI" << endl;
            }
    cout << "Posta: " << oseba.naslov.postna_stevilka << " " << oseba.naslov.posta << endl;
    cout << "Naslov: " << oseba.naslov.ulica << endl;
}

void vpis(Oseba& oseba) {
    int tip;
    cout << "VPIS PODATKOV NOVEGA VNOSA" << endl << endl;
    cout << "VPISI IME: ";
    cin >> oseba.ime;
    cout << "VPISI PRIIMEK: ";
    cin >> oseba.priimek;
    cout << "VPISI STAROST: ";
    cin >> oseba.starost;
    cout << "VPISI TIP NASLOVA ( 1-STALNI / 2-ZACASNI ): ";
    cin >> tip;

    switch (tip){
        case 1:
            oseba.naslov.tip = STALNI;
            break;
        case 2:
            oseba.naslov.tip = ZACASNI;
            break;
        default:
            cout << "Napaka! Izbrali ste napacen tip naslova. " <<endl;
    }

    cout << "VPISI POSTNO STEVILKO: ";
    cin >> oseba.naslov.postna_stevilka;
    cout << "VPISI POSTO: ";
    cin >> oseba.naslov.posta;
    cout << "VPISI NASLOV (FORMAT:'TrgGeneralaMaistra1'): ";
    cin >> oseba.naslov.ulica;
    cout << endl;
}

int main() {
    Oseba oseba;
    int x;
    cout << "VPIS IN IZPIS OSEBNIH PODATKOV" << endl << endl;
    for (;;) {
        cout << "Dolocite zahtevano operacijo (1-VPIS, 2-IZPIS): ";
        cin >> x;
        cout << endl << endl;
        switch (x){
        case 1:
            vpis(oseba);
            break;
        case 2:
            izpis(oseba);
            break;
        default:
            cout << "Izbrali niste nobene operacije!" << endl << endl;
        }
    }

    return 0;
}

修改 我知道公共,受保护和私人......对不起,如果我不够清楚,但我必须使用单独的文件(每个类都有.h和.cpp) 我熟悉如何使用单个文件来完成这项工作。当我尝试在自己的头文件和cpp文件中拆分类时,会出现问题。

编辑2: 好的,我看到我的问题很不清楚。请原谅我缺乏努力。我会简化我的问题。

我正在尝试创建另一个类的类成员。所以我的文件(目前)看起来像这样:

PersonalInfo.h

#include <iostream>
#include <string>

using namespace std;

#ifndef PERSONALINFO_H
#define PERSONALINFO_H

class Person {

private:
    string name;
    Location location;

public:
    void setName(string n);
    string getName();
    void setLocation(int post_num, string post, string loc);   //I'm not sure about this part being correct.
    Location getLocation();

};

#endif

PersonalInfo.cpp

#include "PersonalInfo.h"

void Person::setName(string n){
    name = n;
}

string Person::getName(){
    return name;
}

void Person::setLocation(int post_num, string post, string loc){
    Location location;
        location.post_num = post_num;
        location.post = post;
        location.loc = loc;
}

string Oseba::getLocation(){
    return location.post_num, location.post, location.loc;
}

Location.h

#include <iostream>
#include <string>

using namespace std;

#ifndef LOCATION_H
#define LOCATION_H

class Location {
public:                       //I made this public so I don't overcomplicate things but I need them private and set via methods like in the PersonalInfo class.
    int post_num;
    string post;
    string loc;
};


#endif

3 个答案:

答案 0 :(得分:0)

class Naslov {
  public:
    string ulica;
    string posta;
    int postna_stevilka;
    TIP_NASLOVA tip;
};

class Oseba {
  public:
    string ime;
    string priimek;
    int starost;
    Naslov naslov;
};

默认情况下class的内容为private。您必须明确定义哪些部分public

答案 1 :(得分:0)

只需将每个struct替换为class并将所有成员标记为公开,因为structclass之间的差异是,如果您不添加访问标记(例如as:publicprivateprotected),然后对于结构,您拥有所有具有公共访问权限和wtith私有访问类的项目:

struct Naslov {
    string ulica;
    string posta;
    int postna_stevilka;
    TIP_NASLOVA tip;
};

将是:

class Naslov {
public:
    string ulica;
    string posta;
    int postna_stevilka;
    TIP_NASLOVA tip;
};

<强> UPD : 在您的情况下,无需在.cpp文件中执行某些操作。通常,在.h文件中,您需要定义类接口:为您的类的用户声明公共方法,为您提供一些帮助的私有方法等等。在你的情况下没有任何类方法,所以你不能移动&#34;没有&#34;到.cpp文件(我撒谎 - 它可能 - 你有班级成员,所以你可以使用pimpl idiom,但不是你的情况)。 但是如果你真的想要创建.cpp文件,你可以为两种情况定义类构造函数(在头文件中 - 使用Include guard)。对于Naslov

// .h file
#ifndef NASLOW_H_
#define NASLOW_H_

class Naslov
{
public:
    Naslov();
    Naslov(const string& u, const string& p, int p, TIP_NASLOVA t);

public:
    string ulica; // use google translate: улица -> street
    string posta;
    int postna_stevilka;
    TIP_NASLOVA tip;
};
#endif

// .cpp file
#include "Naslov.h"
Naslov::Naslov(const string& u, const string& p, int ps, TIP_NASLOVA t)
    : ulica(u)
    , posta(p)
    , postna_stevilka(ps)
    , tip(t)
{
}

Naslov::Naslov()
    : ulica()
    , posta()
    , postna_stevilka()
    , tip(STALNI)
{
}

答案 2 :(得分:0)

简单,

struct Naslov {
string ulica;
string posta;
int postna_stevilka;
TIP_NASLOVA tip;
};

struct Oseba {
string ime;
string priimek;
int starost;
Naslov naslov;
};

将成为

首先说,Oseba.h,

class Oseba {
private:    
string ime;
string priimek;
int starost;
Naslov naslov;
public:
string getIme();
string getPriimek();
int getStarost();
.
.
.
void setIme(string value);
void setPriimek(string value);
.
.
.
};

现在Oseba.cpp包含了这些函数的所有实现......

include "Oseba.h"
Oseba::getIme(){return this->ime;}
.
.
.

同样,为Naslov做这个,同样,创建一个Constant.h,它将包含你声明的枚举,然后将这个头文件添加到每个ur文件中(Oseba.h / Naslov.h)

最后,你的“main.cpp”将包含这些头文件,你会很高兴!

希望这有效!

注意::我有目的地创建了getter setter,因为访问类变量是一种不好的做法......只需使用这些getters来访问字段。干杯!