Member 14771149 Ответов: 2

Доступ к защищенным данным члена класса


Я хочу сделать класс супергероем который содержит защищенные данные здоровье члена и функцию члена:
1 - нестандартный конструктор, который инициализирует работоспособность при вводе >100 до 100
2-применить функцию питания, которая берет указатель супер героя класса P и лечит его, увеличивая здоровье на 10.

и еще один класс супер истребитель который содержит личные данные участника:
огневая мощь представляет собой огневую мощь, которую может представлять поплавок

Функции публичных членов:
1-не конструктор по умолчанию, который принимает здоровье и огневую мощь и инициализирует элемент данных.
2-Applypower: он принимает указатель класса супергероя P. Он применяет силу следующим образом:
 Если текущая SuperFighter (вызывающий объект) находится слишком близко, чтобы умереть (здоровье &ЛТ; 20),
затем он становится дружелюбным и исцеляет P (используя ApplyPowers класса SuperHero).
 Если у нынешнего Суперфайтера есть здоровье >= 20, то он становится злым и сражается
P путем уменьшения здоровья P на огневую мощь текущего супер-истребителя.
Помните: здоровье может быть отрицательным, но не более 100

та часть,когда здоровье меньше 20, работает хорошо, но когда я делаю здоровье больше 20, это уменьшает здоровье суперфайтера, а не супергероя.

Что я уже пробовал:

//Заголовочный файл супергероя:
#pragma once
#include <iostream>
#include <string>
using namespace std;


class SuperHero {
protected:
	float Health;
	
public:
	SuperHero(float);
	virtual void ApplyPower(SuperHero*);
	 void print();

};


//.cpp файл супер героя
#include <string>
#include "2.h"
using namespace std;

SuperHero::SuperHero(float h) {
	Health = (h > 100) ? 100 : h;
}
void SuperHero::ApplyPower(SuperHero* p) {
	if (p->Health >= 95 && p->Health <= 100) {
		p->Health = 100;
	}
	else
	{
		{
			p->Health +=10;
		}
	}
}

void SuperHero::print() {
	cout << Health << ' ';
}


//заголовочный файл superfighter:
#pragma once
#include <string>
#include "2.h"
#include <iostream>
using namespace std;

class superfighter :protected SuperHero {
private:
	float firepower;
	friend class SuperHero;
public:
	superfighter(float, float);
	void ApplyPower(SuperHero*);
	void print();
};


//superfighter .cpp
#include <string>
#include "2.h"
#include <iostream>
#include "3.h"
using namespace std;

superfighter::superfighter(float h, float f) :SuperHero(h){
	firepower = f;
}
void superfighter::ApplyPower(SuperHero* p) {
	if (Health < 20) {
		p->ApplyPower(p);
	}
	else {
		SuperHero::Health -=firepower;
	}
}
void superfighter::print() {
	cout << Health << ' ' << firepower << endl;
}


//основная функция
#include <string>
#include "2.h"
#include <iostream>
#include "3.h"
using namespace std;

int main() {
	float a, b, c;
	cin >> a;
	cin >> b;
	cin >> c;
	SuperHero h1(a);
	superfighter f1(b, c);
	f1.ApplyPower(&h1);
	h1.print();
	f1.print();
}

2 Ответов

Рейтинг:
2

Stefan_Lang

Несколько слов о наследстве:

Когда один класс наследует от базового класса (также называемого суперклассом), это означает, что он наследует все свойства и функции этого базового класса. Однако экземпляр этого производного класса все еще является только одним экземпляром! Отдельного экземпляра базового класса не существует! Например, когда вы указываете

#include <iostream>
class animal {
public:
   virtual void speak() {} // default: doesn't speak a lot...
};
class cat : public animal {
public:
   void speak() { std::cout << "Meow" << std::endl ; }
};

Нет отдельного экземпляра класса animal! Кошка-это уже животное. Вы можете заставить свое животное по выбору "говорить" без необходимости создавать или передавать другой объект:
int main() {
   animal* my_animal = new cat; // this is a cat. It is also an animal!
   my_animal->speak();
   delete my_animal;
   return 0;
}

Конечно, основное применение для использования наследования заключается в том, что у вас есть два или более производных класса, а также функции или массивы, которые взаимодействуют с экземплярами этих классов через интерфейс базового класса:
#include <iostream>
class animal {
public:
   virtual void speak() {} // default: doesn't speak a lot...
};
class cat : public animal {
public:
   void speak() { std::cout << "Meow" << std::endl ; }
};
class cow : public animal {
   void speak() { std::cout << "Moo" << std::endl; }
};
void talk(animal* first, animal* second) {
   first->speak();
   second->speak();
}
int main() {
   animal* my_cat = new cat;
   animal* my_cow = new cow;
   talk(my_cat, my_cow);
   delete my_cat;
   delete my_cow;
   return 0;
}

Функция talk() не знает и не должна знать, о чем здесь говорят животные. Он знает только, что это животные, у которых есть функция говорить, потому что это то, что определяет базовый класс animal.


Рейтинг:
0

Daniele Rota Nodari

суперфайтер-это подкласс SuperHero.
ApplyPower получает SuperHero экземпляр через параметр p.
Ты хочешь, чтобы все изменилось p->Health но вместо этого вы меняетесь Health стоимость superfigther пример.
"SuperHero::Health -= firepower" не использует параметр "p", поэтому, очевидно, ничего не меняет. p.

защищенный модификатор позволяет члену класса быть защищенным от прямого/явного снаружи мотивации; изменение значения из другого экземпляра (как вы хотите сделать в superfighter::ApplyPower) считается внешней модификацией;

Если вы хотите изменить здоровье экземпляра супергероя из другого экземпляра супергероя (даже суперфайтера), вы должны сделать здоровье общедоступным или предоставить общедоступный метод, который реализует эту операцию.

Одним из решений (не обязательно лучшим) является объявление одного или нескольких методов в SuperHero изменить Health ценность.
Вы можете думать что-то вроде:

void Heal(SuperHero* healer, float amount)
{
  if (amount > 0)
    Health += amount;
}
void Damage(SuperHero* attacker, float amount)
{
  if (amount > 0)
    Health -= amount;
}


Эти два примера методов изменят Health текущего экземпляра на указанную сумму.
То healer и attacker параметры позволяют реализовать дополнительную логику, например решить, следует ли применять заданное количество или применять дополнительные эффекты.

Затем вы можете заменить его
SuperHero::Health -=firepower;

с
p->Damage(this, firepower);