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!";
}
}