Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何根据类访问特定的受保护继承成员?_C++_Class_Inheritance_Vector_Scope - Fatal编程技术网

C++ 如何根据类访问特定的受保护继承成员?

C++ 如何根据类访问特定的受保护继承成员?,c++,class,inheritance,vector,scope,C++,Class,Inheritance,Vector,Scope,好的,我有MainShop(基类),然后是swarshop和BowShop(派生类)以及另一个名为Inventory的派生类。在我的基类中有一个受保护的向量,当我从派生类访问它时,它是可以的,但每个都有自己的值。如何将它们设置为具有相同的值 //MainShop.h #pragma once class MainShop { private: //some variables protected: vector <string> WeaponInventory; publi

好的,我有
MainShop
(基类),然后是
swarshop
BowShop
(派生类)以及另一个名为
Inventory
的派生类。在我的基类中有一个受保护的向量,当我从派生类访问它时,它是可以的,但每个都有自己的值。如何将它们设置为具有相同的值

//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();
//MainShop.h
#布拉格语一次
类主站
{
私人:
//一些变量
受保护的:
矢量武器清单;
公众:
//一些与向量无关的函数
};
//MainShop.cpp
/*职能的执行*/
//剑术
#布拉格语一次
#包括“MainShop.h”
类别:公共主楼
{
私人:
智力选择;
公众:
void gethop();
void setWeaponSoldier(int i,字符串s);
void soldierShop();
};
//hop.cpp
#包括“shop.h”
void剑客商店::士兵商店()
{
这->设置武器士兵(1,“1)明藤一孟治\n+4伤害\n 150金币);
此->设置武器士兵(2,“2)Shusui\n+10伤害\n(黄金”);
此->设置武器士兵(3,“3”长生不老药\n+16伤害\n 300金币);
这->设置武器士兵(4,“4”刀疤\n+24伤害\n 550金币);
这->设置武器士兵(5,“5”拉格纳罗克\n+32伤害\n(黄金);
这->设置武器士兵(6,“6)永恒黑暗\n+40伤害\n(黄金”);
这->设置武器士兵(7,“7”Masamone\n+52伤害\n 750金币);
这->设置武器士兵(8,“8”灵魂卡利伯\n+60伤害\n 900金币);
此->GetShop();
选择;
开关(选择)
{
案例1:
武器库存。推回(“明藤一梦”);

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


您的问题是关于数据的,您只能从类内访问受保护的成员,请触摸“受保护”不允许来自类外的成员。您需要将受保护的变量更改为public或添加public方法来执行您试图完成的任务。

实例变量用于实例…您只能在静态级别共享。是的,但每次我尝试时,例如:在swarshop.cpp中,我可以执行MainShop;然后我去购物。武器库存。把你推回去(“某物”);它给我一个错误,说武器库存是MainShop的受保护成员。如果我声明它是静态的,那么与该静态变量相关的所有内容也必须是静态的?不…变量…你的问题是关于数据,你只能从类内访问受保护的成员,点击“受保护”不允许来自类外部的成员。您需要将受保护变量更改为public或添加一个public方法来执行您试图完成的任务。您所谈论的这个public方法必须在基类中实现?因为我已经有了访问向量的公共方法,例如
getSwordShop();
设置武器士兵(int i,字符串s)
我只是说变量WeaponInventory可以在主类或子类内部进行操作,而不是从其他任何地方进行操作。您之前粘贴的代码由于可访问性而出现错误。该代码行不能属于子类,它必须属于非子类的类中的方法。
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!";
    }
}