Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2010, 13:41   #1
Lunex.08
Форумчанин
 
Аватар для Lunex.08
 
Регистрация: 25.02.2009
Сообщений: 145
По умолчанию Вложенные классы.

Здравствуйте ув. программисты!
У меня возникли некоторые затруднения как вы уже догадались со вложенными классами.Код:
Код:
#include <iostream>
using namespace std;

class Class_first
{
	public:
	friend class Class_second;
	class Class_second
	{
	public:	
		int spate;
		friend class Class_third;
		class Class_third
		{
		public:
			friend class Class_second;
			friend class Class_first;
			void inic ();
			void display ();
		};
		friend class Class_first;
	};
};

void Class_first::Class_second::Class_third::inic(/*Объявление параметра*/)
{
	//Чтобы spate получил к примеру значение 22 от параметра x.
}

void Class_first::Class_second::Class_third::display ()
{
	//Вывод значения spate.
}

int main ()
{
	Class_first *p;
	Class_first obj;
	p=&obj;
	p->Class_second::spate=10;
	system ("pause");
	return 0;
}
Суть проблемы:
В предыдущем коде я в комментариях отметил действия методов вложенного класса.И у меня вопрос:как реализовать эти функции?
Буду премного благодарен.
Компьютеры бесподобны: за несколько минут они могут совершить такую грандиозную ошибку, какую не в состоянии сделать множество людей за многие месяцы.
Lunex.08 вне форума Ответить с цитированием
Старый 16.02.2010, 14:03   #2
Lunex.08
Форумчанин
 
Аватар для Lunex.08
 
Регистрация: 25.02.2009
Сообщений: 145
По умолчанию

Извините за создание лишней темы.Я уже разобрался.В другой программе на вложенные классы по глупости ошибался, на мелочи и не заметил ее.Еще раз прошу прощения.
Компьютеры бесподобны: за несколько минут они могут совершить такую грандиозную ошибку, какую не в состоянии сделать множество людей за многие месяцы.
Lunex.08 вне форума Ответить с цитированием
Старый 16.02.2010, 14:17   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну раз разобрался, то скажи что нужно сделать чтоб решить тему - мне тоже интересно, я не спец по Си.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2010, 11:11   #4
Lunex.08
Форумчанин
 
Аватар для Lunex.08
 
Регистрация: 25.02.2009
Сообщений: 145
По умолчанию

Ну я тоже не спецНо кое-что объяснить могу.Надеюсь, если что,мой ответ исправят или дополнят по необходимости.К примеру вот доработал пред. код:
Код:
#include <iostream>
using namespace std;

class Class_first
{
	public:
	friend class Class_first;
	friend class Class_second;
	class Class_second
	{
	public:	
		int spate;
		friend class Class_third;
		friend class Class_first;
		class Class_third
		{
		public:
			friend class Class_second;
			friend class Class_first;
			int inic (int x);
			void display ();
		};
	};
};

int Class_first::Class_second::Class_third::inic (int x)
{
	Class_first::Class_second obj;
	obj.spate=x;
	return obj.spate;
}

void Class_first::Class_second::Class_third::display ()
{
	Class_first::Class_second::Class_third p;
	Class_first::Class_second::Class_third *q;
	q=&p;
	cout << q->inic (8);
}

int main ()
{
	Class_first::Class_second::Class_third *p;
	Class_first::Class_second::Class_third obj;
	p=&obj;
	p->display ();
	system ("pause");
	return 0;
}
Обращаться к членам классов можно с помощью механизма friend.
Методы можно объявить как внутри класса,так и вне его т.е. в области глобальной видимости,ставя перед именем метода префикс:имя более верхнего объемлющего класса. Обращаться к членам класса и его методам можно только с помощью объектов (указателей).
Компьютеры бесподобны: за несколько минут они могут совершить такую грандиозную ошибку, какую не в состоянии сделать множество людей за многие месяцы.
Lunex.08 вне форума Ответить с цитированием
Старый 17.02.2010, 11:46   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

божеж ты мой...
1. friend тут нигде не используется, читай, для чего нужно это ключевое слово, можешь смело удалять.
2.
Код:
	Class_first::Class_second::Class_third *p;
	Class_first::Class_second::Class_third obj;
	p=&obj;
Код:
	Class_first::Class_second::Class_third p;
	Class_first::Class_second::Class_third *q;
	q=&p;
какой в этом смысл?

3.
Код:
	Class_first::Class_second obj;
	obj.spate=x;
	return obj.spate;
смысл этого так же неясен. для чего нужен временный объект, если возвращаешь значение его члена? проще переопредели свой int через typedef и используй по-человечески.

4.
Цитата:
Обращаться к членам класса и его методам можно только с помощью объектов (указателей).
с чего вдруг? если это такое условие, то ты его неправильно интерпретировал

аналог твоего:
Код:
#include <iostream>
using namespace std;

class Class_first {
public:
	class Class_second {
	public:
		int spate;
		class Class_third {
		public:
			int inic (int x);
			void display ();
		};
	};
};

int Class_first::Class_second::Class_third::inic (int x)
{
	Class_first::Class_second obj;
	obj.spate = x;
	return obj.spate;
}

void Class_first::Class_second::Class_third::display ()
{
	Class_first::Class_second::Class_third *q = new Class_first::Class_second::Class_third();
	cout << q->inic(8) << endl;
	delete q;
}

int main ()
{
	Class_first::Class_second::Class_third *p = new Class_first::Class_second::Class_third();
	p->display ();
	delete p;
	return 0;
}
и кстати, объекты вложенных классов обычно используются только внешним классом (коли уж ты решил класс делать вложенным). Так же они не могут лезть в переменные внешних классов (только если объекты этих классов/переменных не константы и не статические, иначе опять же смысла нет). у тя походу нет разделения между классом и объектом
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 17.02.2010 в 11:54.
pproger вне форума Ответить с цитированием
Старый 17.02.2010, 11:58   #6
Lunex.08
Форумчанин
 
Аватар для Lunex.08
 
Регистрация: 25.02.2009
Сообщений: 145
По умолчанию

Цитата:
божеж ты мой...
Бог не поможет))
Цитата:
1. friend тут нигде не используется, читай, для чего нужно это ключевое слово, можешь смело удалять.
Да,согласен,в данном случае не нужен.friend пригодится в том случае,если члены класса будут private.
Цитата:
Class_first::Class_second::Class_th ird p;
Class_first::Class_second::Class_th ird *q;
q=&p;

какой в этом смысл?
Я так предпочитаю обращаться к членам класса.Может и громоздко, но это уже привычка)

Цитата:
аналог твоего:
Код:

#include <iostream>
using namespace std;

class Class_first {
public:
class Class_second {
public:
int spate;
class Class_third {
public:
int inic (int x);
void display ();
};
};
};

int Class_first::Class_second::Class_th ird::inic (int x)
{
Class_first::Class_second obj;
obj.spate = x;
return obj.spate;
}

void Class_first::Class_second::Class_th ird:isplay ()
{
Class_first::Class_second::Class_th ird *q = new Class_first::Class_second::Class_th ird();
cout << q->inic(8) << endl;
delete q;
}

int main ()
{
Class_first::Class_second::Class_th ird *p = new Class_first::Class_second::Class_th ird();
p->display ();
delete p;
return 0;
}
и кстати, объекты вложенных классов обычно используются только внешним классом (коли уж ты решил класс делать вложенным). Так же они не могут лезть в переменные внешних классов (только если объекты этих классов/переменных не константы и не статические, иначе опять же смысла нет). у тя походу нет разделения между классом и объектом
Да,ваш код красивее и компактнее)
Спасибо за исправления.
Компьютеры бесподобны: за несколько минут они могут совершить такую грандиозную ошибку, какую не в состоянии сделать множество людей за многие месяцы.

Последний раз редактировалось Lunex.08; 17.02.2010 в 12:20.
Lunex.08 вне форума Ответить с цитированием
Старый 17.02.2010, 12:01   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Lunex.08
Цитата:
Я так предпочитаю обращаться к членам класса.Может и громоздко, но это уже привычка)
ну плохая привычка, что сказать. занимаешь на стеке память под объект и под указатель на этот объект.
пс. если нравится ходить по указателю, но через объект, используй smart pointers, или тот же auto_ptr
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вложенные структуры в С++ серг Помощь студентам 3 21.12.2009 17:29
вложенные циклы!!!! for_tuna Помощь студентам 6 08.12.2009 07:07
вложенные циклы илька Помощь студентам 4 07.12.2009 09:53
Вложенные циклы Chief Паскаль, Turbo Pascal, PascalABC.NET 3 06.01.2009 16:34