Наследование закрытых членов от базового класса к производным классам С++

Я пытаюсь унаследовать name,skeletonType и numLegs из моего базового класса в мой производный класс. У меня есть базовый класс с именем Беспозвоночные и производный класс с именем Паук. Я хочу иметь возможность использовать частные переменные с производным классом из моего базового класса. Я продолжаю получать ошибку компиляции в строке 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;
}

ВЫВОД:


person JDoe    schedule 30.11.2016    source источник
comment
В чем именно проблема!? Вы этого не упомянули и не показали.   -  person StoryTeller - Unslander Monica    schedule 30.11.2016
comment
Выглядит нормально, а можно подробнее вашу проблему?   -  person Moerwald    schedule 30.11.2016
comment
Вы можете просто добавить некоторые protected функции доступа. Или, если нет инварианта или других ограничений на значения, просто сделайте переменные-члены protected   -  person Cheers and hth. - Alf    schedule 30.11.2016
comment
Я не очень понимаю, как этого добиться. Я продолжаю читать и изучать его, но пока не могу понять. Я продолжаю получать сообщение об ошибке при компиляции кода. Я не могу заставить его распечатать то, что я хочу распечатать. Вот здесь = Паук: Коричневый Отшельник, количество ног = 8, тип скелета = ЭКЗОСКЕЛЕТ   -  person JDoe    schedule 30.11.2016
comment
Когда вы говорите, что получаете ошибку, вы действительно должны сказать, какую ошибку вы получаете...   -  person rodrigo    schedule 30.11.2016
comment
@Cheersandhth.-Alf: IME, защищенные переменные-члены редко бывают полезны: если нет инварианта или ограничений, вы также можете стать общедоступными.   -  person rodrigo    schedule 30.11.2016
comment
Spider::Spider(string name):Invertebrate(name&,EXOSKELETON,8) Как вы думаете, что означает name&?   -  person n. 1.8e9-where's-my-share m.    schedule 30.11.2016
comment
Я думал, что смогу получить то, что хранится в адресе памяти.   -  person JDoe    schedule 30.11.2016
comment
Как вы думаете, почему вам нужно что-то делать с адресами памяти? Это неправильный синтаксис, и он вам все равно не нужен.   -  person n. 1.8e9-where's-my-share m.    schedule 30.11.2016


Ответы (2)


Вот проблемы в вашем коде: -

  1. В файле .h -

const string NAME_PREFIX = "Паук: ";

не является допустимым способом инициализации членов cont - const следует инициализировать через список инициализаторов конструктора (до C++11).

Правильный путь в .cpp

Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
{
    name = NAME_PREFIX + Invertebrate::getName();
}
  1. В том же конструкторе вы написали name&, что неверно, просто передайте name.

Spider::Spider(имя строки):NAME_PREFIX(имя),Invertebrate(имя,ЭКЗОСКЕЛЕТ,8)

person instance    schedule 30.11.2016
comment
Спасибо Всем за помощь. Это, кажется, проблема здесь. Мой учитель настроил заголовочный файл и сказал нам, чтобы основная функция работала, и я работаю над ней уже несколько дней. Я даже не знал, что в базовый класс можно включить больше переменных. - person JDoe; 30.11.2016
comment
const string NAME_PREFIX = "Spider: "; является допустимым синтаксисом, начиная с C++11. - person n. 1.8e9-where's-my-share m.; 30.11.2016
comment
@ н.м.да, ты прав, я забыл упомянуть об этом .. отредактированный ответ - person instance; 30.11.2016

Кажется, я наконец обнаружил, что такое ваша строка 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)
{
}
person rodrigo    schedule 30.11.2016
comment
Я внес эти изменения, и теперь моя программа падает. - person JDoe; 30.11.2016