我无法访问我的基地的受保护成员 class
I can't access to the protected member of my base class
我是使用 C++ 进行编程的新手,在创建我的构造函数和对象时遇到了一些麻烦。
我怎样才能访问我的受保护成员,例如 Fahrzeug class 中的 int p_iID?
我必须分别为我的两个对象访问它们。
如果你能帮我解决这个问题,我会很高兴。
class Fahrzeug {
private:
protected:
string p_sName;
int p_iID;
double p_dMaxGeschwindigkeit;
double p_dGesamtStrecke;
double p_dGesamtZeit;
double p_dZeit;
public:
virtual void vAusgeben(Fahrzeug* pFahrzeug1,Fahrzeug* pFahrzeug2);
virtual void vKopf();
virtual void vSimulieren(Fahrzeug *pFahrzeug, Fahrzeug *pFahrzeug2);
class PKW;
class PKW: public Fahrzeug{
PKW(const int p_iMaxID, string p_sName, double p_dMaxGeschwindigkeit, double p_dGesamtStrecke) {
p_iID = p_iMaxID;
this->p_sName = p_sName;
this->p_dMaxGeschwindigkeit = (p_dMaxGeschwindigkeit < 0) ? 0 : p_dMaxGeschwindigkeit;
this->p_dGesamtStrecke = p_dGesamtStrecke;
}
void vAusgeben(PKW pkw1, PKW pkw2) {
cout << "\n";
PKW pkw1;
PKW pkw2;
pkw1.vKopf();
cout << setw(5) << left << pkw1.p_iID<< " " << setw(10) <<pkw1.p_sName << setw(8) << " " << setw(15) << showpoint << pkw1.p_dMaxGeschwindigkeit << setw(3) << " " << pkw1.p_dGesamtStrecke; //Here I have the issue with pkw1.p_sName
cout << "\n";
cout << setw(5) << left << pkw2.p_iID << " " << setw(10) << pkw2.p_sName << setw(8) << " " << setw(15) << showpoint << pkw2.p_dMaxGeschwindigkeit << setw(3) << " " << pkw2.p_dGesamtStrecke;
cout << "\n";
}
}
void vAusgeben(PKW pkw1, PKW pkw2) {
您可能不想按值传递 PKW
对象(或期望 object slicing)。改为传递 const 引用:
void vAusgeben(const PKW& pkw1, const PKW& pkw2) {
另外,为什么你 shadowing 你的 2 个参数带有这些局部变量?
PKW pkw1; // ???
PKW pkw2; // ???
除了评论(和另一个答案)中提出的问题外,受保护成员还有一条特殊规则,有时会让人们感到惊讶。派生类型的对象可以访问其基类子对象的受保护成员,但不能访问其他对象的受保护成员。所以:
struct B {
protected:
int i;
};
struct D : B {
void f(const B&);
};
void D::f(const B& b) {
i = 3; // okay, accessing my own protected member
b.i = 3; // no, access to protected member of different object not allowed
}
在题中的代码中,函数PKW::vAusgeben
可以访问它自己的p_sName
、p_dMaxGeschwindigkeit
和p_dGesamtStrecke
的副本,但是它不能访问pkw1.p_sName
、pkw1.p_dMaxGeschwindigkeit
或 pkw1.p_dGesamtStrecke
。
我是使用 C++ 进行编程的新手,在创建我的构造函数和对象时遇到了一些麻烦。 我怎样才能访问我的受保护成员,例如 Fahrzeug class 中的 int p_iID? 我必须分别为我的两个对象访问它们。
如果你能帮我解决这个问题,我会很高兴。
class Fahrzeug {
private:
protected:
string p_sName;
int p_iID;
double p_dMaxGeschwindigkeit;
double p_dGesamtStrecke;
double p_dGesamtZeit;
double p_dZeit;
public:
virtual void vAusgeben(Fahrzeug* pFahrzeug1,Fahrzeug* pFahrzeug2);
virtual void vKopf();
virtual void vSimulieren(Fahrzeug *pFahrzeug, Fahrzeug *pFahrzeug2);
class PKW;
class PKW: public Fahrzeug{
PKW(const int p_iMaxID, string p_sName, double p_dMaxGeschwindigkeit, double p_dGesamtStrecke) {
p_iID = p_iMaxID;
this->p_sName = p_sName;
this->p_dMaxGeschwindigkeit = (p_dMaxGeschwindigkeit < 0) ? 0 : p_dMaxGeschwindigkeit;
this->p_dGesamtStrecke = p_dGesamtStrecke;
}
void vAusgeben(PKW pkw1, PKW pkw2) {
cout << "\n";
PKW pkw1;
PKW pkw2;
pkw1.vKopf();
cout << setw(5) << left << pkw1.p_iID<< " " << setw(10) <<pkw1.p_sName << setw(8) << " " << setw(15) << showpoint << pkw1.p_dMaxGeschwindigkeit << setw(3) << " " << pkw1.p_dGesamtStrecke; //Here I have the issue with pkw1.p_sName
cout << "\n";
cout << setw(5) << left << pkw2.p_iID << " " << setw(10) << pkw2.p_sName << setw(8) << " " << setw(15) << showpoint << pkw2.p_dMaxGeschwindigkeit << setw(3) << " " << pkw2.p_dGesamtStrecke;
cout << "\n";
}
}
void vAusgeben(PKW pkw1, PKW pkw2) {
您可能不想按值传递 PKW
对象(或期望 object slicing)。改为传递 const 引用:
void vAusgeben(const PKW& pkw1, const PKW& pkw2) {
另外,为什么你 shadowing 你的 2 个参数带有这些局部变量?
PKW pkw1; // ???
PKW pkw2; // ???
除了评论(和另一个答案)中提出的问题外,受保护成员还有一条特殊规则,有时会让人们感到惊讶。派生类型的对象可以访问其基类子对象的受保护成员,但不能访问其他对象的受保护成员。所以:
struct B {
protected:
int i;
};
struct D : B {
void f(const B&);
};
void D::f(const B& b) {
i = 3; // okay, accessing my own protected member
b.i = 3; // no, access to protected member of different object not allowed
}
在题中的代码中,函数PKW::vAusgeben
可以访问它自己的p_sName
、p_dMaxGeschwindigkeit
和p_dGesamtStrecke
的副本,但是它不能访问pkw1.p_sName
、pkw1.p_dMaxGeschwindigkeit
或 pkw1.p_dGesamtStrecke
。