类中的类
Class inside a class?
我正在尝试将此代码从使用结构转换为使用类。我遇到的问题是,我不知道应该如何声明、初始化等类,以便它们以下面发布的代码中的方式工作。我必须为每个类使用单独的文件(即class1.h、class1.cpp、class2.h、class2.cpp、main.cpp),我不知道如何实现与使用structs相同的效果。如何在类中嵌套类?
我的另一个问题是,我应该如何处理枚举列表?何时何地声明/初始化它们?
谢谢大家!希望我是清白的。。我试着在谷歌上搜索,但没有发现任何有用的东西。
这是代码:
#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版:好吧,我觉得我的问题很不清楚。对不起,我没有尽力。我会简化我的问题。
我正在努力使一个班成为另一个班的成员。所以我的文件(目前)看起来是这样的:
个人信息.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
个人信息.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;
}
位置.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
简单,
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,其中将包括您声明的枚举,然后将此头文件添加到每个文件(Oseba.h/Naslov.h)
最后,您的"main.cpp"将包括这些头文件,您就可以开始了!
希望这能奏效!
注意:我有目的地创建了getter-setter,因为访问这样的类变量是一种糟糕的做法。。。只需在您想要访问字段的地方使用这些getter。干杯
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
。
只需将每个struct
替换为class
,并将所有成员标记为public,因为struct
和class
之间的区别在于,如果您不添加访问标记(如:public
、private
、protected
),则对于structs,您拥有所有具有public访问权限的项,而对于classes,则拥有wtith private访问权限:
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文件中,你需要定义类接口:为类的用户声明公共方法,为你的一些帮助声明私有方法等等。在你的情况下没有任何类方法,所以你不能把"nothing"移到.cpp文件中(我撒谎了-这是可能的-你有类成员,所以你可以使用pimpl习惯用法,但这不是你的情况)。但是,如果您真的想要创建.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)
{
}
- 没有找到相关文章