Доброго времени суток!
У меня есть небольшая проблема- объявил 3 класса (A,B,C) и в классах B,C сделал ссылки на класс A:
Код:
class A {
public:
int prop[100];
int funct();
}
class B {
private:
A *clA;
public:
B (A cl); //constructor
~B(); //destructor
void setProp();
}
B::B(A cl){
clA=&cl;
} //constructor
void B::setProp(){
for (int i=0;i<100;i++){
clA->prop[i]=i;
}
}
. . .
A classA;
B classB(classA);
Класс C по реализации похож на B. Проблема в том, что после вызова метода setProp класса classB массив prop в classA не изменяется. Как решить эту проблему?
Здесь вы создаёте временный безымянный объект с типом A, и уже с ним работаете, а вам нужно работать с самим classA. Для этого измените конструктор на B::B(A &cl) или на B::B(A *cl), тогда в конструктор B::B будет передаваться ссылка или указатель на classA, а не его временная копия.
PS: Что-бы таких ошибок не было в будущем скройте конструктор копирования и оператор присваивания вот так:
#include <iostream>
using namespace std;
class A {
public:
int prop[100];
// ...
};
class B {
private:
A* clA;
public:
B (A* cl) {
clA = cl;
}
~B() {}
void setProp() {
for ( int i = 0; i < 100; i++ ) {
clA->prop[i] = i;
}
}
};
int main() {
A a;
A* ap = &a;
B b( ap );
b.setProp();
// Проверяем значения в массиве
for ( int i = 0; i < 100; i++ ) {
cout << "a.prop[] = " << a.prop[i] << endl;
}
return 0;
}
P.S. И кстати, после закрывающей фигурной скобки определения класса точку с запятой ставить все же нужно...