c классы



Классы в си

Автор Алексей задал вопрос в разделе Другие языки и технологии

C++ Классы и получил лучший ответ

Ответ от ?????? Зелёный змий ??????[гуру]
Судя по вопросу, вы имеете плохое представление о классах.
Поля (они же - свойства класса, они же - переменные члены класса) - это пременные члены объекта класса. Чтобы пользоваться полями объекта класса нужет объект класса.
Методы (они же - функции-члены класса) - это функции-члены объекта класса. Чтобы ими пользоваться нужет объект класса. Иначе- никак.
class B { };
class A { B b; };
При такой организации совсем неразумно пытаться из класса b вызывать метод класса a. Потому что объект b не знает в состав какого класса от входит, и где этот объект, метод которого нужно вызывать.
Если очень нужно чтобы объект знал своего владельца, то нужно использовать указтель на объект, например так:
class A; // просто декларация типа
class B
{
public:
A *pParent; // указатель на объект-владелец объекта b
B(A *p) : pParent(p) {} // конструктор с параметром
void Method();
};
class A
{
public:
A():b(this) {} // конструктор с инициализацией объекта b
B b;
void Method();
};
void B::Method()
{
pParent->Method();
}
void A::Method()
{
// TODO:
}
А можно использовать вложенные классы, так лучше
class A
{
public:
class B
{
public:
void Method();
} b;
void Method();
};
void A::B::Method()
{
// извлекает смещение поля b относительно объекта A
size_t offset = (size_t)&reinterpret_cast<const char&>(((A*)0)->b);
// получаем указатель на объект-владелец
A *parent = reinterpret_cast<A*>(reinterpret_cast<char*>(this) - offset);
// вызываем метод объекта-владелеца
parent->Method();
}
void A::Method()
{
// TODO;
}

Ответ от Коровин Иван[гуру]
Сначала определить оба класса, потом уже определять методы

Ответ от Непростой Гусь[гуру]
пользоваться указателями на класс. Их можно использовать еще до определения класса.
Код не проверял!! !
// =============== Вариант 1 ===============
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA ){ pA->setA(); }
} oB;
void set_vA() { A = 14; }
};
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
// =============== Вариант 2 ===============
//Если первый не заработает
class A;
class A {
public:
int vA;
class B {
public:
void reset_vA ( A *pA );
} oB;
void set_vA() { A = 14; }
};
void B::reset_vA ( A *pA ) { pA->setA(); }
void main() {
A obA;
A.vA=7777;
A.oB.reset_vA(&obA);
}
//======================
Если ничего не заработает, отпишись на мыло, будет время - попробую разобраться. Хотя это изврат. Может с передачей в метод reset_vA указателя на функцию setA? Да, в мыле укажи название и версию среды разработки. Мало-ли

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: C++ Классы
Класс программирование на Википедии
Посмотрите статью на википедии про Класс программирование
Метод программирование на Википедии
Посмотрите статью на википедии про Метод программирование
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*