好的,我有 MainShop
(基类)然后 SwordShop
和 BowShop
(派生类)和另一个名为 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/