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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 14:01   #1
wwe2012
Пользователь
 
Аватар для wwe2012
 
Регистрация: 17.01.2011
Сообщений: 51
По умолчанию Дружиские функци и перегрузка операторов

class CMyStack
{
public:
CMyStack();
~CMyStack();
void Push(int d);
int Pop();
bool isEmpty();
void Print();

private:
struct Node
{
int d;
Node *p;
};

Node *top;
};

CMyStack::CMyStack():top(NULL)
{

}

void CMyStack::Push(int d)
{
Node *pv = new Node;
pv->d = d;
pv->p = top;
top = pv;
}

int CMyStack::Pop()
{
if (isEmpty())
{
return -1;
}
int temp = top->d;
Node *pv = top;
top = top->p;
delete pv;
return temp;
}


bool CMyStack::isEmpty()
{
return top ? false : true;
}

void CMyStack::Print()
{
while (top)
{
std::cout << Pop() << ' ';
}

std::cout << std::endl;
}

CMyStack::~CMyStack()
{
while (top)
{
Node *pv = top;
top = top->p;
delete pv;
}

}


тут осталось то что я не пойму как это сделать
 Перегруженные операции:
+ добавление элемента;
- удаление элемента;
[] индексирование;
= копирование;
== отношение равенства;
> отношение порядка;
<< вывод значения контейнера в стандартный поток вывода
 Объявление и реализация дружественной функции.
помагите пожалуста очень надо не это надо здать чрез 5дней. на работе полный завал я работаю в милиции. и учусь на заочном на програмиста помагите пожалуйста очень надо. выручите ребята
wwe2012 вне форума Ответить с цитированием
Старый 16.03.2011, 17:38   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Друзья класса... Это делается для того, чтобы организовать более гибкую систему безопасности. Используйте friend перед нужной функцией классом, переменнои т.д. для того, чтобы разрешить использование метода класса извне этого класса. Вот здесь более подробно и понятно http://www.cyberguru.ru/programming/...y2-page21.html Перегруженные операции http://chg.fatal.ru/misc/prog-cpp/prog_109.html Я так понял ваш вопрос.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 17.03.2011, 07:54   #3
wwe2012
Пользователь
 
Аватар для wwe2012
 
Регистрация: 17.01.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan Посмотреть сообщение
Друзья класса... Это делается для того, чтобы организовать более гибкую систему безопасности. Используйте friend перед нужной функцией классом, переменнои т.д. для того, чтобы разрешить использование метода класса извне этого класса. Вот здесь более подробно и понятно http://www.cyberguru.ru/programming/...y2-page21.html Перегруженные операции http://chg.fatal.ru/misc/prog-cpp/prog_109.html Я так понял ваш вопрос.

Та я понял когда пишу дружеские функции и перегружаю операторы компилятор выдает ощибку. Если не сложно можеш сделать а то у меня сейчас на роботе завал времени нету.
wwe2012 вне форума Ответить с цитированием
Старый 17.03.2011, 16:28   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Код:
class CMyStack
{
	friend int GetTopNodeD(CMyStack* myStack);
public:
	CMyStack();
	~CMyStack();
	void Push(int d);
	int Pop();
	bool isEmpty();
	void Print();

	CMyStack& operator +(int d);

private:
	struct Node
	{
		int d;
		Node *p;
	};

	Node *top;
};

CMyStack& CMyStack::operator +(int d)
{
	Push(d);
	return *this;
}

int GetTopNodeD(CMyStack* myStack)
{
	if (myStack->top != NULL)
	{
		return myStack->top->d;
	}

	return -1;
}

CMyStack::CMyStack():top(NULL)
{

}

void CMyStack::Push(int d)
{
	Node *pv = new Node;
	pv->d = d;
	pv->p = top;
	top = pv;
}

int CMyStack::Pop()
{
	if (isEmpty())
	{
		return -1;
	}
	int temp = top->d;
	Node *pv = top;
	top = top->p;
	delete pv;
	return temp;
}


bool CMyStack::isEmpty()
{
	return top ? false : true;
}

void CMyStack::Print()
{
	while (top)
	{
		std::cout << Pop() << ' ';
	}

	std::cout << std::endl;
}

CMyStack::~CMyStack()
{
	while (top)
	{
		Node *pv = top;
		top = top->p;
		delete pv;
	}

}


int _tmain(int argc, _TCHAR* argv[])
{
	CMyStack lolo;

	lolo + 2 + 3 + 4;

	std::cout << GetTopNodeD(&lolo) << std::endl;

	lolo.Print();

	return 0;
}
GetTopNodeD - дружественная твоему классу функция которая может лезть в его приватные поля
CMyStack:perator + - перегрузка оператора + для добавления элемента

все компилится у меня
UltimaBeaR вне форума Ответить с цитированием
Старый 18.03.2011, 11:18   #5
wwe2012
Пользователь
 
Аватар для wwe2012
 
Регистрация: 17.01.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от UltimaBeaR Посмотреть сообщение
Код:
class CMyStack
{
	friend int GetTopNodeD(CMyStack* myStack);
public:
	CMyStack();
	~CMyStack();
	void Push(int d);
	int Pop();
	bool isEmpty();
	void Print();

	CMyStack& operator +(int d);

private:
	struct Node
	{
		int d;
		Node *p;
	};

	Node *top;
};

CMyStack& CMyStack::operator +(int d)
{
	Push(d);
	return *this;
}

int GetTopNodeD(CMyStack* myStack)
{
	if (myStack->top != NULL)
	{
		return myStack->top->d;
	}

	return -1;
}

CMyStack::CMyStack():top(NULL)
{

}

void CMyStack::Push(int d)
{
	Node *pv = new Node;
	pv->d = d;
	pv->p = top;
	top = pv;
}

int CMyStack::Pop()
{
	if (isEmpty())
	{
		return -1;
	}
	int temp = top->d;
	Node *pv = top;
	top = top->p;
	delete pv;
	return temp;
}


bool CMyStack::isEmpty()
{
	return top ? false : true;
}

void CMyStack::Print()
{
	while (top)
	{
		std::cout << Pop() << ' ';
	}

	std::cout << std::endl;
}

CMyStack::~CMyStack()
{
	while (top)
	{
		Node *pv = top;
		top = top->p;
		delete pv;
	}

}


int _tmain(int argc, _TCHAR* argv[])
{
	CMyStack lolo;

	lolo + 2 + 3 + 4;

	std::cout << GetTopNodeD(&lolo) << std::endl;

	lolo.Print();

	return 0;
}
GetTopNodeD - дружественная твоему классу функция которая может лезть в его приватные поля
CMyStack:perator + - перегрузка оператора + для добавления элемента

все компилится у меня
СПС Большое . а как насчет друг опертором которые надо пергрузить, или они не перегружаються в стеки? а можеш оргонозовать конструктор копировщик?
wwe2012 вне форума Ответить с цитированием
Старый 19.03.2011, 10:22   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Другие по аналогии, оператор это простая функция берущая аргументы и что то возвращающая

if (variable == 1)

в этом случае == это у variable оператор - принимает число и возвращает bool

если врубишся поймешь как сделать остальное, единственное с индексированием не оч понятно так как индекса по сути нету, можно по связанному списку переходить просто нужное количество раз = индексу + 1 и возвращать этот элемент

конструктор копирования это конструктор вида

CMyStack::CMyStack(CMyStack &copyFrom)
{
// копируешь данные из copyFrom в *this
}

у тебя же тут вместо него перегрузить просто оператор = надо, тоесть создаешь новый объект копируешь данные текущего в новый и возвращаешь его

Последний раз редактировалось UltimaBeaR; 19.03.2011 в 10:25.
UltimaBeaR вне форума Ответить с цитированием
Старый 19.03.2011, 18:53   #7
wwe2012
Пользователь
 
Аватар для wwe2012
 
Регистрация: 17.01.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от UltimaBeaR Посмотреть сообщение
Другие по аналогии, оператор это простая функция берущая аргументы и что то возвращающая

if (variable == 1)

в этом случае == это у variable оператор - принимает число и возвращает bool

если врубишся поймешь как сделать остальное, единственное с индексированием не оч понятно так как индекса по сути нету, можно по связанному списку переходить просто нужное количество раз = индексу + 1 и возвращать этот элемент

конструктор копирования это конструктор вида

CMyStack::CMyStack(CMyStack &copyFrom)
{
// копируешь данные из copyFrom в *this
}

у тебя же тут вместо него перегрузить просто оператор = надо, тоесть создаешь новый объект копируешь данные текущего в новый и возвращаешь его
А можешь создать конструктор копировщик а то у меня ошибку выдает. очень надо времини почти не осталось
wwe2012 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 11 20.11.2010 13:23
Перегрузка операторов в С++ Purr Помощь студентам 0 09.10.2010 15:12
перегрузка операторов mashuta_ya Общие вопросы C/C++ 0 01.10.2010 18:54
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15