2016-11-30 107 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