Долго думал, как озаглавить топик, никак не мог сформулировать...
В общем, суть вопроса:
как добиться того, чтобы с объектами можно было работать без помощи указателей и ссылок?
Пример:
MFC-шный класс CString.
Могу объявить любую функцию
int f(CString str){
// что угодно.
}
Аргумент в функции объявляется именно CString str, а не CString& str или CString* str.
Соответственно, могу объявить функцию
CString g(){ // не CString&, не CString*
CString temp;
// some manipulations with "temp"
return temp;
} - и все будет нормально.
Можешь объяснить зачем тебе это нужно? В принципе проблем нет кто тебе мешает завести произвольный класс скажем :
class cTest
{
private:
int iTest;
public:
cTest(){};
};
int Function(cTest test)
{
}
Другой вопрос что подобное использование классов приводит к тому что ты не передаешь класс а создаешь его копию в стеке соответвенно это замедляет работу программы. Если тебя это не беспокоит то все что тебе нужно сделать чтобы подобный механизм работал безопасно заводи у класса для которого это нужно конструктор копировшик. Иначе будут проблеммы например такие:
class cTest
{
private:
void * m_pPointer;
public:
cTest(){ m_pPointer = new char[10000];}
virtual ~cTest() {delete []m_pPointer;}
}
int Function(cTest test)
{
}
void Funct()
{
cTest test;
Function(test);
}/// Вот здесь программа свалится с громкими матами.
Передавать в функцию - это полбеды.
Нужно еще и возвращать в качестве результата работы функции.
Класс будет моделировать некую математическую сущность, и над его объектами нужно будет производить арифметические действия.
То есть главная собака зарыта в том, чтобы сделать что-то вроде такого:
class mTest{
public:
mTest operator+(mTest);
mTest operator*(mTest);
....
};
Со ссылками есть свой косяк: для того, чтобы передать в качестве результата mTest*, нужно его создать внутри функции. А отслживать все это дело трудновато будет, алгоритм уж больно навороченный (всякие рекурсии с ветвлениями).
2 Гость888:
можно чуть подробнее? что-то не могу нарыть ничего...
Хотя бы ссылку какую...