c++ - 如何根据类访问特定的 protected 继承成员?

标签 c++ class inheritance vector scope

好的,我有 MainShop (基类)然后 SwordShopBowShop (派生类)和另一个名为 Inventory 的派生类.我的基类中有一个 protected vector ,当我从我的派生类访问它时它没问题,但每个都有自己的值(value)。我怎样才能将它们都设置为具有相同的值?

//MainShop.h
#pragma once
class MainShop
{

private:
//some variables
protected:
    vector <string> WeaponInventory;
public:
//Some functions not related to the vector

};

//MainShop.cpp
/*Implementation of functions*/

//SwordShop.h
#pragma once
#include "MainShop.h"

class SwordShop: public MainShop
{
    private:
    int choice;
    public:
        void getSwordShop();
        void setWeaponSoldier(int i, string s);
        void soldierShop();
};

//SwordShop.cpp
#include "SwordShop.h"
void SwordShop::soldierShop()
{
    this->setWeaponSoldier(1, "1) Meito Ichimonji\n   +4 Damage\n   150Gold");
    this->setWeaponSoldier(2, "2) Shusui\n   +10 Damage\n   230Gold");
    this->setWeaponSoldier(3, "3) Elixir\n   +16 Damage\n   300Gold");
    this->setWeaponSoldier(4, "4) Blade of scars\n   +24 Damage\n   550Gold");
    this->setWeaponSoldier(5, "5) Ragnarok\n   +32 Damage\n   610Gold");
    this->setWeaponSoldier(6, "6) Eternal Darkness\n   +40 Damage\n   690Gold");
    this->setWeaponSoldier(7, "7) Masamune\n   +52 Damage\n   750Gold");
    this->setWeaponSoldier(8, "8) Soul Calibur\n   +60 Damage\n   900Gold");

    this->getSwordShop();

    cout << "What would you like to buy?";
    cin >> choice;
    switch (choice)
    {
        case 1:
          WeaponInventory.push_back("Meito Ichimonji");
          cout << "You have Successfully Bought Meito Ichimonji\nIt has been added to your inventory\n";
            break;

        case 2:
          WeaponInventory.push_back("Shusui");
          cout << "You have Successfully Bought Shusui\nIt has been added to your inventory\n";
            break;
            //ETC

        default:
            cout << "Error! You have entered an invalid answer\nPlease try again";
            this->soldierShop();
    }
    cout << "your total items are: "<< WeaponInventory.size();

好吧,假设我买了两件商品。在这里它会显示我有 2 个项目。但如果我这样做 cout << "your total items are: "<< WeaponInventory.size();在我的 Inventory.cpp 中它会说我有 0!那是我的问题。

void SwordShop::getSwordShop()
{
    //Display Choices
    for (map<int, string>::iterator iter = WeaponSoldier.begin(); iter != WeaponSoldier.end(); iter++)
    {
        cout << iter->second << endl;
        cout << endl;
    }
}

void SwordShop::setWeaponSoldier(int i, string s)
{
    WeaponSoldier[i] = s;
}


//BowShop.h
#pragma once
#include "MainShop.h"

class BowShop: public MainShop
{
    private:
    int choice2;
    public:
        void getBowShop();
        void setWeaponArcher(int i, string s);
        void ArcherShop();
};

//BowShop.cpp
#include "BowShop.h"
void BowShop::ArcherShop()
{
    BowShop::setWeaponArcher(1,"1) Arondight\n   +4 Damage\n   150Gold");
    BowShop::setWeaponArcher(2,"2) Gugnir\n   +10 Damage\n   230Gold");
    BowShop::setWeaponArcher(3,"3) Susano'\n   +16 Damage\n   300Gold");
    BowShop::setWeaponArcher(4,"4) Longinus\n   +24 Damage\n   550Gold");
    BowShop::setWeaponArcher(5,"5) Hrunting\n   +32 Damage\n   610Gold");
    BowShop::setWeaponArcher(6,"6) Clarent\n   +40 Damage\n   690Gold");
    BowShop::setWeaponArcher(7,"7) Shinigami\n   +52 Damage\n   750Gold");
    BowShop::setWeaponArcher(8,"8) Caliburn\n   +60 Damage\n   900Gold");

    this->getBowShop();//Display options

    cout << "What would you like to buy?";
    cin >> choice2;
    switch (choice2)
    {
        case 1:
                WeaponInventory.push_back("Arondight");
                cout << "You have Successfully Bought Arondight\nIt has been added to your inventory\n";
            break;

        case 2:
                WeaponInventory.push_back(" Gugnir");
                cout << "You have Successfully Bought  Gugnir\nIt has been added to your inventory\n";
            break;

        //ETC

        default:
            cout << "Error! You have entered an invalid answer\nPlease try again";
            this->ArcherShop();
    }
}

void BowShop::getBowShop()
{
    //Display Choices
    for (map<int, string>::iterator iter = WeaponArcher.begin(); iter != WeaponArcher.end(); iter++)
    {
        cout << iter->second << endl;
        cout << endl;
    }
}

void BowShop::setWeaponArcher(int i, string s)
{
    WeaponArcher[i] = s;
}


//Inventory.h
#Pragma once
#include "MainShop.h"

class Inventory: public MainShop//access base class data like protected members
{
    private:
    int choice;
    public:
        void DisplayInventory();
        void DisplayStats();

};

//Inventory.cpp
#include "Inventory.h"

void Inventory::DisplayInventory()
{
    cout << "\nWhat do you want to do?\n1) Check Status\n2) Equip Weapons";//Equip what is in your inventory
    cin >> choice;
    switch (choice)
    {
        case 1: this->DisplayStats();
            break;
        case 2:cout << WeaponInventory.size() << endl;//debug
            if (!WeaponInventory.empty())//Make sure inventory is not empty
            {
                cout << "Your current Weapons are: \n";
                for (unsigned int i = 0; i < WeaponInventory.size(); ++i)
                    cout << i << ") " << WeaponInventory[i] << endl;
            }
            else cout << "You do not currently have any items!";
        default: cout << "Error on switch!";
    }
}

每次我运行它时,它都会直接进入 else它显示我没有任何元素。我只想为我的弓和剑商店使用一个 vector ,因为 vector 会占用大量内存,而且我的老师说要将它们保持在最低限度。所以我只想要一个 vector 来接收我的弓类和剑类的项目,但出于某种原因,它就像我有多个 vector 一样,每个 vector 都有自己的一组项目。请帮忙!

最佳答案

听起来您想要声明一个静态变量,以便所有子类实例都具有相同的值。

您的问题是关于数据的,您只能从类(class)内部访问 protected 成员,不允许从类(class)外部接触“ protected ”成员。您需要将 protected 变量更改为公共(public)变量或添加公共(public)方法来执行您要完成的任务。

关于c++ - 如何根据类访问特定的 protected 继承成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844828/

相关文章:

c++ - C++ 中的有序多线程输出

c++ - jpeg_decompress_struct 结构大小不匹配

mysql - Twitter4j 状态 MySql

javascript - 限制一个类可以被实例化的次数

C++ 仅在满足模板类型的条件时才创建类的实例

c++ - SDL2 : How to keep aspect ratio when resizing the window

c++ - Qt Creator 中 C++ 注释的自动换行

c++ - 类和成员函数模板特化出错

Python:调用父实例方法

java - 为什么这段代码打印父类(super class)而不是子类的值