2016-11-30 106 views
0

我想从我的基类继承我的派生类的名称,skeletonType和numLegs。 我有一个名为Invertebrates的基类和名为Spider的派生类。我想能够从我的基类使用派生类的私有变量。我一直收到第47行的编译错误,它表示在','之前预期的主表达式。从基类继承私有成员到派生类C++

我试图让我的输出看起来像这样:

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:

+1

到底是什么问题!?你没有提到它,也没有证明它。 – StoryTeller

+0

看起来不错,你能详细说明你的问题吗? – Moerwald

+0

您可以简单地添加一些'protected'访问器函数。或者,如果这些值没有不变量或其他约束,只需使成员变量为'protected'即可。 –

回答

0

这里是你的代码的问题: -

  1. 在.h文件中 -

常量字符串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_PREFIX(名称),无脊椎动物(姓名,外骨骼,8)

    +0

    感谢大家帮助我。这似乎是这里的问题。我的老师设置了头文件并告诉我们让主要功能起作用,并且我现在正在为此工作几天。我甚至不知道你可以在基类中包含更多的变量。 – JDoe

    +2

    'const string NAME_PREFIX =“Spider:”;'自从C++ 11以来是有效的语法。 –

    +0

    @ n.m.yeah你是对的,我忘了提及..edited答案 – instance

    0

    我想,我终于发现了您的线路47:

    Spider::Spider(string name):Invertebrate(name&,EXOSKELETON,8) 
    { 
        name = NAME_PREFIX + Invertebrate::getName(); 
    } 
    

    这个函数有两个问题:

    1. 什么是&name&是什么?这不是有效的语法!
    2. 您不能直接访问this->name,因为它在基类中是私有的。相反,在这里您正在修改本地name参数,并没有什么用处。

    您可以使基地name公开或受保护。或者你可以添加一个setName()保护功能。

    但在我看来,这个成员可以是私人的和只读的。该解决方案将是在施工时间,指定正确的name

    Spider::Spider(string name) 
        :Invertebrate(NAME_PREFIX + name, EXOSKELETON, 8) 
    { 
    } 
    
    +0

    我做了这些更改,我的程序现在崩溃。 – JDoe