Я пытаюсь изменить значение переменной класса A, через функцию, которая определена/объявлена в классе B. Я пробовал несколько способов, и я не нашел тот, который работает.
File : myheader.h
class A {
public:
int x;
};
class B:public A
{
public:
void Print(void)
{
A::x=0;
}
};
хорошо, и в основном...
#include <iostream>
#include "myheader.h"
using namespace std;
A mya;
B myb;
int main(){
mya.x=10;
cout<<mya.x<<endl; //That will print 10
myb.Print();
cout<<mya.x<<endl; //That will print also 10, i want it to print 0
return 0;
}
Это печатает 10 и 10. Я хочу иметь доступ к переменной x в классе A через функцию из класса B. Я не могу найти что-то, что работает...
В своем коде, mya
и myb
являются отдельными экземплярами. Два совершенно разных объекта.
myb.Print()
изменяет значение x
на myb
объекта (myb.x
), но не делает ничего общего mya
. Попробуйте распечатать myb.x
с последней строкой cout
:
cout << myb.x << endl;
------ EDIT (в ответ на ваш комментарий) ------
Рассмотрим следующий код.
Способ иметь экземпляр B
(в данном случае Cat
) работать с экземпляром A
(в данном случае Animal
) заключается в передаче ссылки на экземпляр A на экземпляр B (tom.eats( jerry );
),
В этом примере экземплярами являются tom
, jerry
и spike
. Подобно вашему mya
и myb
.
class Animal {
public:
Animal() { _alive = true; }
bool isAlive() { return _alive; } // getter
void setAlive( bool value ) { _alive = value; } // setter
bool _alive;
};
class Cat : public Animal {
public:
void eats( Animal &animal ) {
animal.setAlive( false );
}
};
class Mouse : public Animal { };
int main( int argc, char **argv ) {
Cat tom;
Mouse jerry;
Animal spike; // a dog, but could be any animal
cout << tom.isAlive() << endl; // true, the cat named "tom" is alive
cout << jerry.isAlive() << endl; // true, the mouse named "jerry" is alive
cout << spike.isAlive() << endl; // true, the dog named "spike" is alive
tom.eats( jerry ); // the cat eats the mouse. so sad.
// the cat can do this because Mouse is also an Animal
cout << tom.isAlive() << endl; // true, the cat named "tom" is alive
cout << jerry.isAlive() << endl; // false, the mouse named "jerry" is not alive
cout << spike.isAlive() << endl; // true, the dog named "spike" is alive
tom.eats( spike ); // the cat eats the dog. impressive.
// the cat can do this because spike is an Animal
cout << tom.isAlive() << endl; // true, the cat named "tom" is alive
cout << jerry.isAlive() << endl; // false, the mouse named "jerry" is not alive
cout << spike.isAlive() << endl; // false, the dog named "spike" is not alive
tom.eats( tom ); // the cat eats itself. this cat is really hungry.
// the cat can do this because Cat is an Animal
cout << tom.isAlive() << endl; // false, the cat named "tom" is not alive
cout << jerry.isAlive() << endl; // false, the mouse named "jerry" is not alive
cout << spike.isAlive() << endl; // false, the dog named "spike" is not alive
spike.eats( tom ); // error, Animal class has no eats() method so
// this won't compile
}
mya.x = 10
это означает, чтоx1 = 10
когда вы вызываетеmyb.print()
это означает, что x2 = 0, когда вы вызовcout << mya.x << endl;
это означает печать х1.