【问题标题】:How can I access a specific protected inherited member depending on the class?如何根据类访问特定的受保护继承成员?
【发布时间】:2014-01-17 15:37:11
【问题描述】:

好的,我有MainShop(基类),然后是SwordShopBowShop(派生类)以及另一个名为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();

好吧,假设我买了两件商品。在这里它会显示我有 2 个项目。但如果我在我的 Inventory.cpp 中执行 cout &lt;&lt; "your total items are: "&lt;&lt; WeaponInventory.size();,它会说我有 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,并显示我没有任何项目。我只想为我的弓和剑商店使用一个矢量,因为矢量占用了大量内存,我的老师说将它们保持在最低限度。所以我只想要一个向量来接收我的弓类和剑类中的项目,但由于某种原因,它就像我有多个向量,每个向量都有自己的一组项目。请帮忙!

【问题讨论】:

  • instance 变量用于 INSTANCE....您只能在静态级别共享。
  • 是的,但每次我尝试,例如:在 SwordShop.cpp 我可以做 MainShop shop;然后我做 shop.WeaponInventory.push_back("something");它给了我一个错误,说 Weapon Inventory 是 MainShop 的受保护成员。

标签: c++ class inheritance vector scope


【解决方案1】:

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

您的问题是关于数据的,您只能从班级内部访问受保护的成员,不允许从班级外部接触“受保护”成员。您需要将受保护的变量更改为 public 或添加一个公共方法来执行您想要完成的任务。

【讨论】:

  • 如果我将其声明为静态,那么与该静态变量有关的所有内容也必须是静态的?
  • 不...变量...您的问题是关于数据的,您只能从类内访问受保护的成员,不允许从类外触摸“受保护”成员。您需要将受保护的变量更改为 public 或添加一个公共方法来执行您想要完成的任务。
  • 你说的这个公共方法必须在基类中实现?因为我已经有了访问向量的公共方法,例如getSwordShop();setWeaponSoldier(int i, string s);
  • 我只是说变量 WeaponInventory 可以在主类或子类中被触及,而不是从其他任何地方。您之前粘贴的代码由于可访问性而出现错误。那行代码不能属于子类,它必须属于非子类的类中的方法。
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 2011-05-24
  • 2023-03-23
  • 2014-01-30
  • 2016-06-12
  • 2014-06-09
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多