У меня есть такая классная структура
class B;
class A {
private:
B *b;
public:
A(int val) {
b->SetVal(val);
}
};
class B {
private:
int mynum;
public:
B();
void SetVal(int value) {
mynum = value;
}
};
И главное:
void main(){
A Head(10);
}
Эта программа компилируется, но во время выполнения возвращает нарушение доступа. Я понимаю, что mynum
в class B
является private
но даже если я сделаю его общедоступным, это не сработает. Почему это?
вы должны инициализировать *b
и удалить в ~A()
class A {
private:
B *b;
public:
A(int val) {
b=new B();
b->SetVal(val);
}
~A()
{
if(b)
{
delete b;
b=0;
}
}
};
Вы на самом деле не указали указатель B
нигде. Поэтому, когда ваш конструктор пытается сделать b->SetVal(val)
, вы, вероятно, получите нарушение доступа к памяти и определенно не получите четко определенного поведения.
Это не имеет никакого отношения к тому, что mynum
является частным. Вы всегда можете получить доступ к частным членам класса из методов этого класса.