Классы в си
Автор Алексей задал вопрос в разделе Другие языки и технологии
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? Да, в мыле укажи название и версию среды разработки. Мало-ли
Подскажите, как выглядит поездка из Бангкока в Сием Рип? сколько это по времени? есть ли замена транспорта на маршруте?
Самый быстрый и простой способ добраться из Бангкока в Сием Рип — полет на самолете. Но на
подробнее...
Что за ключевые слова extern и static в С++?
Вообще-то они еще в Си были.
extern - переменная где-то объявлена, но не в этой единице
подробнее...
сочинение на тему : судьба Гринёва (в повести Капитанская дочка)
Повесть А. С. Пушкина «Капитанская дочка» была опубликована в декабре 1836 года в журнале
подробнее...
помогите по сольфеджио 7 класс билет №3
В этом билете только первое задание помогаю. дальше сам.... правила прислать? В Си бемоль мажоре
подробнее...
задача по физике за 7 класс,тема Механическое движение.Плотность вещества
все легко, просто нужно плотность урана (дана в спец. таблице плотностей) умножить на массу
в
подробнее...
История. 7 класс. Повод и основные события Освоения Сибири в 18 веке. Помогите!
В начале 18 века после тяжелой северной войны Россия получила выход в Балтийское море. Прорубив
подробнее...
В чём отличия c++ и java?
Java запускается на собственной java-машине, что делает её кросплатформенной. В java свой
подробнее...
задача за 3 класс
1) 7х2=14 взяли из второй корзины
2)7+14=21 взяли из обоих корзин
3)37-21=16 осталось в
подробнее...
Помогите написать программу перевода чисел из двоичного формата в десятичный на языке C#
как говорится: "haters gonna hate".
специально для Soul.
string bin =
подробнее...
стихи на 8 марта однокласницам (5 класс) искал ненашёл дайте пожалуйста стихи или ссылку хотябы
Да здравствуют девчонки!
Да здравствуют девчонки
С косичками и без!
Пусть
подробнее...
Причины поражения восстания 1863-1864 гг. в Польше,Литве и Беларуси???Оч надо,помогите плиз
1-я причина-это я,
а 2-я все твои друзья.. .
---------------------------------
Самая
подробнее...
Список литературы за 10-11 класс кто нибудь помнит/знает?
А.Н.Островский. Гроза. Бесприданница
И.А.Гончаров. Обломов.
И.С.Тургенев. Отцы и дети.
подробнее...
"Ваше Высокородие"-какому чину соответсвовало сие обращение?
Статский советник в России, гражданский чин 5-го класса по Табели о рангах, соответствовал
подробнее...
что такое сила?физика 7 класс
Сила — векторная физическая величина, являющаяся мерой интенсивности воздействия на данное тело
подробнее...