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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 19:35   #1
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию Полезные вещи для новичков... из С++

Всем привет. Как - то бродя по просторам интернета, много раз натыкался на разных форумах по программированию.. на темы типа - Как объявить указатель на член класса, как им пользоваться...как использовать функции друзья... и тд.. и тп.. Здесь пока такого не встречал... Решил, что если модераторы не против.. То буду выкладывать сюда... что то в духе легких примеров... я думаю что для студентов и начинающих, это будет полезным материалом... Вот первый пример.. с использованием указателей, друзей, и передачи значения типа класс.
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

class sData {
	double sX;
	double sY;
public:
	// Инициализируем X и Y первоначальными значениями.
	sData(double defX, double defY) : sX(defX), sY(defY) {}
	// Создаем функции - инициализаторы значений Х и У.
	double SetX(double userX) { return sX = userX; }
	double SetY(double userY) { return sY = userY; }

	// Объвлем друзей, которые смогут иметь доступ к закрытым переменным.
	friend void Show(sData sVar);
	friend void sCopy(sData &VarOne, sData &VarTwo);
};
void sCopy(sData &VarOne, sData &VarTwo) {
	// Присваеваем первому объекту значение другого.
	VarTwo.sX = VarOne.sX;
	VarTwo.sY = VarOne.sY;
}
void Show(sData sVar) {
		// Выводим на печать значение заданного объекта.
		cout << "X Value is = " << sVar.sX << endl;
		cout << "X Value is = " << sVar.sY << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{

	// Инициализируем переменные значениями по умолчанию, используем два объекта.
	sData c_Obj(0.0, 0.0);
	sData s_Obj(0.0, 0.0);

	// Создаем указатель на функцию - копир.
	void	(*cyPointer) (sData &, sData &) = { sCopy };
	// Создаем указатель на члены класса.
	double	(sData::*XYPointer) (double);
	// Создаем указатель на Функцию прсморт.
	void	(*shPointer) (sData) = { Show }; 

	// Указатель получает ссылку на функцию - член класса, которая инциализирует Х.
	XYPointer = &sData::SetX;
	cout << "New Value For X in c_Obj = " << (c_Obj.*XYPointer) (10.0) << endl;
	// Указатель получает ссылку на функцию - член класса, которая инициализирует У.
	XYPointer = &sData::SetY;
	cout << "New Value For Y in c_Obj = " << (c_Obj.*XYPointer) (10.0) << endl << endl;
	
	// Далее смотрим на то что получилось : )))
	cout << "Value in Second Object:" << endl;
	shPointer(s_Obj);

	cout << endl;
	cout << "After sCopy Function:" << endl;
	cyPointer(c_Obj, s_Obj);
	shPointer(s_Obj);
	
	return 0;
}
Если вдруг что - то будет непонятным - спрашивайте.. с радостью буду подсказывать... Но так же не стоит забывать.. - КНИГИ..и только КНИГИ помогут Вам понять все нюансы... и правила... и только читая, Вы в действительности сможете чему то научиться.. )
Chris D вне форума Ответить с цитированием
Старый 25.01.2010, 20:23   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Chris D, идея неплохая, но это наверное больше относится к ветви C/C++ )
По поводу примера, покрывает много, но очень запутано, я с трудом разобрался что к чему ) Я думаю было бы неплохо побольше пояснений к коду, особенно в тех моментах, которые должен осветить этот пример. а также более однородный и понятный стиль, например получая ссылку на метод вы дописываете &, а получая ссылку на ф-цию просто записываете в фигурные скобки(зачем, кстати?). В принципе для получения ссылки на ф-цию не обязателен оператор &, но зато выглядело бы всё в едином стиле и более читабельно
netrino вне форума Ответить с цитированием
Старый 25.01.2010, 20:53   #3
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

На самом деле. Запись
Код:
double	(sData::*XYPointer) (double);
Подразумавает под собой следующее... - *XYPointer является указателем на функции члены класса sData, функции которые возвращают double
Синтаксис может быть разными
К примеру
Код:
double	(sData::*XYPointer) (double) = { &sData::SetX };
Это то же самое что и
Код:
double	(sData::*XYPointer) (double);
XYPointer = &sData::SetX;
Вот еще один интересный пример в массивами
Код:
class sData {
public :
	sData() {}
	void Print1() {
		cout << "Hello" << " ";
	}
	void Print2() {
		cout << "Programmersforum" << endl;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	
	void (sData::*Pointer[2]) ();
	Pointer[0] = &sData::Print1;
	Pointer[1] = &sData::Print2;

	sData sCall;
	for (int index = 0; index < 2; index++) {
		(sCall.*Pointer[index])();
	}
	return 0;
}
Здесь мы задаем каждый элемент равным определенной процедуре..
В теле цикла делаем необходимы нам действия...

Правило - указатель на функцию член класса, может указывать только на член одного и того же класса.

Чуть позже выложу еще немного интересных примеров )

А что касется единого стиля.. полностью согласен... Но я просто писал на автомате... так как обычно работаю я.. )) Привычка ))
Chris D вне форума Ответить с цитированием
Старый 09.09.2010, 20:34   #4
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

Совсем забыл про этот пост....
Вот еще пара примеров, показывающих то, как можно передавать аргументы в функции...

Этот пример охватывает сразу несколько вещей, сортировку массива, использование шаблона и ... конечно же указатели на функции - члены класса...

Краткие основы описаны в этом топике в первом примере...
Возможно, эти примеры кому - нибудь да помогут, так как на множестве форумов возникают подобные вопросы.. )


Код:
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <vector>


using namespace std;

template <class _T> class sData {
private:
	_T sX;
	_T sY;
public:
	sData(_T sValueOne, _T sValueTwo) : sX(sValueOne), sY(sValueTwo) {}

	void sReplace() {
		_T TEMP	=	sX;
		sX		=	sY;
		sY		=	TEMP;
	}
	void sShowXYValues() {
		cout << "\n\nX Position is: " << sX << "\n";
		cout << "Y Position is: " << sY;
	}	
	void sArrangeByQSort(_T *, const int);
};
template <class _T>
void sData<_T>::sArrangeByQSort(_T *sPrimeArray, const int sSize) {
	for (int index = 1; index < sSize; index++) {
		while(index > 0 && *(sPrimeArray + index) < *(sPrimeArray + index - 1)) {
			_T TEMP							=	*(sPrimeArray + index);
			*(sPrimeArray + index)			=	*(sPrimeArray + index - 1);
			*(sPrimeArray + index - 1)		=	TEMP;
			index--;
		}
	}
}

template <class _T>
void sCallMemberFunction(sData<_T> *cPrimeObj, void (sData<_T>::*ptrToFunc)(_T *, const int), _T *cArray, const int sSize) {
	(cPrimeObj->*ptrToFunc) (cArray, sSize);
}
template <class _T>
void sCallMemberFunction(sData<_T> *cPrimeObj, void (sData<_T>::*ptrToFunc)()) {
	(cPrimeObj->*ptrToFunc) ();
}
int _tmain(int argc, _TCHAR* argv[])
{

	const int sSize = 10;

	int cCurrentArrayInt[sSize] = {4, 6, 2, 3, 5, 2, 67, 43, 23, 65};
	double cCurrentArrayDouble[sSize] = {4.654, 6.432, 2.444, 3.12, 5.434, 2.666, 67.63, 43.345, 23.55, 65.77};

	sData<int> cObjInt(10, 40);
	sData<double> cObjDouble(324.54, 234.55);

	cout << "Current Array Values: \n" << endl;
	cout << "Integer Array Is: ";
	for(int index = 0; index < sSize; index ++) {
			cout << cCurrentArrayInt[index] << " ";
	
	}
	cout << endl;
	cout << "Double Array Is:  ";
	for(int index = 0; index < sSize; index ++) {
			cout << cCurrentArrayDouble[index] << " ";
	}

	sCallMemberFunction(&cObjInt, &sData<int>::sArrangeByQSort, cCurrentArrayInt, sSize);
	sCallMemberFunction(&cObjDouble, &sData<double>::sArrangeByQSort, cCurrentArrayDouble, sSize);

	cout << "\n\nAfter Arrange Array Values:\n\n";
	cout << "Integer Array Is: ";
	for(int index = 0; index < sSize; index ++) {
			cout << cCurrentArrayInt[index] << " ";
	
	}
	cout << endl;
	cout << "Double Array Is: ";
	for(int index = 0; index < sSize; index ++) {
			cout << cCurrentArrayDouble[index] << " ";
	}

	cObjInt.sShowXYValues();

	sCallMemberFunction(&cObjInt, &sData<int>::sReplace);

	cObjInt.sShowXYValues();

	int i;
	cin>> i;
	return 0;
}
Chris D вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга по DirectX9. Для новичков. Montana19 Помощь студентам 1 23.11.2009 13:18
Условия задач для новичков Prihlop Общие вопросы C/C++ 2 24.08.2009 11:18
Программирование сайта (не для новичков) Canidor Фриланс 6 14.07.2009 11:11
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07