从基 class 继承私有成员到派生 classes c++
Inheriting private members from base class to derived classes c++
我正在尝试将名称、skeletonType 和 numLegs 从我的基础 class 继承到我的派生 class。
我有一个名为 Invertebrates 的基础 class 和一个名为 Spider 的派生 class。我希望能够将私有变量与来自我的基础 class 的派生 class 一起使用。我在第 47 行不断收到编译错误,它说预期的主表达式在 ',' 之前。
我试图让我的输出看起来像这样:
Spider:Brown Recluse, number of legs = 8, skeleton type = EXOSKELETON
有人可以帮我指出正确的方向吗?到目前为止,这是我放在一起的。
// invertebrates.h
// invertebrate specifications
#ifndef _INVERTEBRATE_H_
#define _INVERTEBRATE_H_
#include <iostream>
using namespace std;
enum Skeleton_Type { NONE, HYDROSTATIC, EXOSKELETON };
class Invertebrate {
private:
string name;
Skeleton_Type skeletonType;
int numLegs;
protected:
void setSkeletonType(Skeleton_Type skeletonType);
void setNumLegs(int numLegs);
public:
Invertebrate();
Invertebrate(string name, Skeleton_Type skeletonType, int numLegs);
string getName();
Skeleton_Type getSkeletonType();
int getNumLegs();
virtual void print() = 0;
};
class Spider : public Invertebrate {
private:
const string NAME_PREFIX = "Spider: ";
public:
Spider();
Spider(string name);
virtual void print();
};
#endif // _INVERTEBRATE_H_
**********************************************************************
//invertebrates.cpp
#include "invertebrate.h"
void Invertebrate::setSkeletonType(Skeleton_Type skeletonType)
{
this->skeletonType = skeletonType;
}
void Invertebrate::setNumLegs(int numLegs)
{
this->numLegs = numLegs;
}
Invertebrate::Invertebrate()
{
name = "noName";
skeletonType = NONE;
numLegs = 0;
}
Invertebrate::Invertebrate(string name, Skeleton_Type skeletonType, int numLegs)
{
this->name = name;
this->skeletonType = skeletonType;
this->numLegs = numLegs;
}
string Invertebrate::getName()
{
return this->name;
}
Skeleton_Type Invertebrate::getSkeletonType()
{
return this->skeletonType;
}
int Invertebrate::getNumLegs()
{
return this->numLegs;
}
Spider::Spider(string name):Invertebrate(name,EXOSKELETON,8)
{
name = Invertebrate::getName();
}
void Spider::print()
{
string strSkType = "";
if(this->getSkeletonType() == 0)
strSkType= "none";
else if(this->getSkeletonType() == 1)
strSkType= "Hydrostatic";
else if(this->getSkeletonType() == 2)
strSkType= "exoskeleton";
cout << this->NAME_PREFIX + getName();
cout << ", number of legs = " << this->getNumLegs() << ", skeleton type = " << strSkType << endl;
}
int main()
{
Spider *sp = new Spider("Brown Recluse");
sp->print();
return 0;
}
OUTPUT:
我想我终于发现你的第 47 行是什么了:
Spider::Spider(string name):Invertebrate(name&,EXOSKELETON,8)
{
name = NAME_PREFIX + Invertebrate::getName();
}
这个函数有两个问题:
name&
中的 &
是什么?那是无效的语法!
- 您不能直接访问
this->name
,因为它在基 class 中是私有的。相反,您在这里修改了本地 name
参数,这没有任何用处。
您可以使基地 name
public 或受保护。或者您可以添加一个 setName()
受保护的函数。
但在我看来,该成员可以设为私有和只读。解决方案是在构建时指定正确的 name
:
Spider::Spider(string name)
:Invertebrate(NAME_PREFIX + name, EXOSKELETON, 8)
{
}
这是您的代码中的问题:-
- 在 .h 文件中 -
const string NAME_PREFIX = "Spider: ";
不是初始化 cont 成员的有效方法 - const 应该通过构造函数初始化列表初始化(直到 C++11)。
.cpp 中的正确方法
Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
{
name = NAME_PREFIX + Invertebrate::getName();
}
- 在同一个构造函数中你写了name&,这是错误的,只是传递name。
Spider::Spider(string
name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
我正在尝试将名称、skeletonType 和 numLegs 从我的基础 class 继承到我的派生 class。 我有一个名为 Invertebrates 的基础 class 和一个名为 Spider 的派生 class。我希望能够将私有变量与来自我的基础 class 的派生 class 一起使用。我在第 47 行不断收到编译错误,它说预期的主表达式在 ',' 之前。
我试图让我的输出看起来像这样:
Spider:Brown Recluse, number of legs = 8, skeleton type = EXOSKELETON
有人可以帮我指出正确的方向吗?到目前为止,这是我放在一起的。
// invertebrates.h
// invertebrate specifications
#ifndef _INVERTEBRATE_H_
#define _INVERTEBRATE_H_
#include <iostream>
using namespace std;
enum Skeleton_Type { NONE, HYDROSTATIC, EXOSKELETON };
class Invertebrate {
private:
string name;
Skeleton_Type skeletonType;
int numLegs;
protected:
void setSkeletonType(Skeleton_Type skeletonType);
void setNumLegs(int numLegs);
public:
Invertebrate();
Invertebrate(string name, Skeleton_Type skeletonType, int numLegs);
string getName();
Skeleton_Type getSkeletonType();
int getNumLegs();
virtual void print() = 0;
};
class Spider : public Invertebrate {
private:
const string NAME_PREFIX = "Spider: ";
public:
Spider();
Spider(string name);
virtual void print();
};
#endif // _INVERTEBRATE_H_
**********************************************************************
//invertebrates.cpp
#include "invertebrate.h"
void Invertebrate::setSkeletonType(Skeleton_Type skeletonType)
{
this->skeletonType = skeletonType;
}
void Invertebrate::setNumLegs(int numLegs)
{
this->numLegs = numLegs;
}
Invertebrate::Invertebrate()
{
name = "noName";
skeletonType = NONE;
numLegs = 0;
}
Invertebrate::Invertebrate(string name, Skeleton_Type skeletonType, int numLegs)
{
this->name = name;
this->skeletonType = skeletonType;
this->numLegs = numLegs;
}
string Invertebrate::getName()
{
return this->name;
}
Skeleton_Type Invertebrate::getSkeletonType()
{
return this->skeletonType;
}
int Invertebrate::getNumLegs()
{
return this->numLegs;
}
Spider::Spider(string name):Invertebrate(name,EXOSKELETON,8)
{
name = Invertebrate::getName();
}
void Spider::print()
{
string strSkType = "";
if(this->getSkeletonType() == 0)
strSkType= "none";
else if(this->getSkeletonType() == 1)
strSkType= "Hydrostatic";
else if(this->getSkeletonType() == 2)
strSkType= "exoskeleton";
cout << this->NAME_PREFIX + getName();
cout << ", number of legs = " << this->getNumLegs() << ", skeleton type = " << strSkType << endl;
}
int main()
{
Spider *sp = new Spider("Brown Recluse");
sp->print();
return 0;
}
OUTPUT:
我想我终于发现你的第 47 行是什么了:
Spider::Spider(string name):Invertebrate(name&,EXOSKELETON,8)
{
name = NAME_PREFIX + Invertebrate::getName();
}
这个函数有两个问题:
name&
中的&
是什么?那是无效的语法!- 您不能直接访问
this->name
,因为它在基 class 中是私有的。相反,您在这里修改了本地name
参数,这没有任何用处。
您可以使基地 name
public 或受保护。或者您可以添加一个 setName()
受保护的函数。
但在我看来,该成员可以设为私有和只读。解决方案是在构建时指定正确的 name
:
Spider::Spider(string name)
:Invertebrate(NAME_PREFIX + name, EXOSKELETON, 8)
{
}
这是您的代码中的问题:-
- 在 .h 文件中 -
const string NAME_PREFIX = "Spider: ";
不是初始化 cont 成员的有效方法 - const 应该通过构造函数初始化列表初始化(直到 C++11)。
.cpp 中的正确方法
Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
{
name = NAME_PREFIX + Invertebrate::getName();
}
- 在同一个构造函数中你写了name&,这是错误的,只是传递name。
Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)