Простите, если я не совсем понял - мой C ++ немного ржавый.
По вопросу (1) - Вы пробовали ключевое слово "this"?
Например:
void func() { this->y_ = 5; }
Вот пример, почти идентичный вашему:
указатель 'this' в C ++
Для вопроса 2 выВы просите рекурсивное включение объекта.Это все равно что сказать: что такое лук?Это кожура, которая содержит лук.Хорошо, что Лук внутри также является Пилингом, который содержит Лук, затем Пил, затем Лук и т. Д. Без какого-либо механизма для остановки (Лук может быть Ядром, который ничего не содержит), первая реализация объекта Лука будетцикл бесконечно, пока вся память не будет израсходована.
В качестве справки, память может быть извлечена только при необходимости, а не раньше.
Для вопроса 3 я выбираю ленивый выходскажем, это всего лишь правила.
ОБНОВЛЕНИЕ: Сейчас я не на работе, поэтому у меня было больше времени, чтобы немного больше исследовать.Как я уже сказал, мой C ++ немного ржавый.
По существу, для Q 1 вы пытаетесь получить доступ к членам класса "cb" из класса "iterator".Мои исследования показывают, что, поскольку «итератор» является подклассом «cb», он не получает никаких специальных прав доступа.Таким образом, вы не можете получить доступ к "cb :: y_" из "iterator", и вы также не можете использовать "this-> y_".Методы (функции) внутри класса могут напрямую обращаться к "y_".Подклассы не могут.
Обратите внимание на следующее, которое успешно компилируется:
class cb {
public:
int y_;
class iterator {
public:
void func() {
cb *z = new cb();
z->y_ = 5;
} // (1)
private:
int x_;
cb *a; // (2)
};
void funcCB() { }
};
class Human
{
public:
void func() const {
cb c; // (3)
c.funcCB();
}
// (4)
cb *z;
};
Возможно, это не то, чего вы пытаетесь достичь, но я ожидаю, что то, что вы хотите сделать, можетне будет сделано так, как вы хотите.Лучше всего было бы реализовать «итератор» как отдельный класс, отличный от «cb», и сделать его «другом» классом «cb».Или, может быть, еще лучше и проще, просто включите в класс набор итераторов.Методы будут иметь полный доступ ко всем атрибутам класса.
Также обратите внимание на указатель на ссылку "cb".Он не компилируется как простой экземпляр объекта в подклассе.Опять же, проблема с луком.
Кстати, помните, что C ++ - это не Паскаль.Это не Java.Он может выполнять подклассы, но, как вы видите, он не очень хорошо работает, или, по крайней мере, он не делает их так, как это делают другие языки.Вам лучше создавать каждый класс, полностью отличающийся от любого другого класса, кроме обычного наследования.Это своего рода неофициальный "Путь C ++".