Использование C ++ и изменение личных / защищенных атрибутов базового класса - PullRequest
0 голосов
/ 08 мая 2018

Прошу прощения, если я спрашиваю то, что спрашивалось много раз здесь. Я очень новичок в C ++. Я хочу знать, как заставить производный класс наследовать копии личных атрибутов его базового класса. Либо так, либо вы можете изменять их с помощью открытых методов, таких как методы получения и установки, из базового класса.

По сути, у меня есть класс Person, и он наследуется от класса Creature. Я хочу, чтобы объекты типа Person имели атрибуты, как в классе Creature. Я хочу, чтобы приватные атрибуты в классе Creature оставались приватными, потому что меня учили, что только функции класса должны быть открытыми, а не переменными класса. Однако я не могу вызвать публичные методы класса Creature в функции, и класс Person, похоже, не наследует их или их копии.

Причина, по которой я отказываюсь просто сделать частные атрибуты общедоступными, заключается в том, что я хочу изучать правильные методы программирования. Я не уверен, является ли эта ситуация исключением из правила или нет.

У меня есть cpp файлы, которые обрабатывают реализацию. Надеюсь, этого будет достаточно, чтобы помочь вам ответить на мой вопрос. Мой базовый класс:

/***
File: Creature.h
Desc: Contains Creature Class Definitions.
This is the base class for the Animal, Person, and PlayerCharacter classes.

Author: LuminousNutria
Date: 5-7-18
***/

#include <string>

#ifndef _CREATURE_H_
#define _CREATURE_H_

class Creature
{
private:
    // General Information
    std::string speciesName;
    int hitpoints;
    int movement;

    // Physical Attributes
    int strength;
    int willpower;
    int intelligence;
    int leadership;

public:
    // setters
    void setSpeciesName(const std::string a);
    void setHitpoints(const int a);
    void setMovement(const int a);

    void setStrength(const int a);
    void setWillpower(const int a);
    void setIntelligence(const int a);
    void setLeadership(const int a);

    // getters
    std::string getSpeciesName();
    int getHitpoints();
    int getLoyalty();
    int getMovement();

    int getStrength();
    int getWillpower();
    int getIntelligence();
    int getLeadership();

    // modders
    void modHitpoints(const int a);
    void modMovement(const int a);

    void modStrength(const int a);
    void modWillpower(const int a);
    void modIntelligence(const int a);
    void modLeadership(const int a);
};

Мой производный класс:

/***
File: Person.h
Desc: Contains Person Class Definitions.
This is a derived class of the Creature class.

Author: LuminousNutria
Date: 5-7-18
***/


#include "Creature.h"

#include <string>

#ifndef _PERSON_H_
#define _PERSON_H_

class Person
{
protected:
    std::string personName;
    int loyalty;
    int experience;
    int level;
    int cash;

public:
    // constructors
    Person();
    Person(const std::string pName, const int loy, const int exp,
        const int lvl, const int c,
        const std::string sName, const int hp, const int mov,
        const int stre, const int will, const int intl,
        const int lead);

    // setters
    void setPersonName(std::string pName);
    void setLoyalty(const int loy);
    void setExperience(const int exp);
    void setLevel(const int lvl);
    void setCash(const int c);

    // getters
    std::string getPersonName();
    int getLoyalty();
    int getExperience();
    int getLevel();
    int getCash();

    // modders
    void modLoyalty(int a);
    void modExperience(int a);
    void modLevel(int a);
    void modCash(int a);
};

#endif

Реализация метода setSpeciesName класса существ:

void Creature::setSpeciesName(const std::string a)
{
    speciesName = a;
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

В предоставленном коде Person не наследуется от Creature, поэтому он не наследует членов класса Creature.

Определите ваш класс Person так, чтобы он наследовал от Creature

class Person : public Creature
{
    // same as before
};

См. Различие между частным, публичным и защищенным наследованием для получения дополнительной информации о публичном и частном наследовании.Обычно вы хотите публичное наследство.

0 голосов
/ 08 мая 2018

Существуют два способа решения этой проблемы: 1. Явно вызовите базовый конструктор в лишенный конструктор. 2. Используйте оператор Friend для использования приватных элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...