Перегрузка << и >>
От: moroz Россия  
Дата: 27.04.01 06:53
Оценка:
Есть класс для которого перегружаются операторы,
обозначаю как friend, но компилятор VC кричит что в определении идет доступ к private переменным (ну так конечно же!) и не компилит:(
Перенёс определения в inline всё заработало, но все же не хочет их применять по отношению к этому классу:(

ps: Проделывал то же самое в Builder'e там работает.

Объясните это компиллер дерьмо или я не всё учёл?
Re: Перегрузка << и >>
От: willi  
Дата: 27.04.01 08:24
Оценка:
Здравствуйте moroz, 27.04.2001 00:53:38 вы писали:

>Есть класс для которого перегружаются операторы,

>обозначаю как friend, но компилятор VC кричит что в определении идет доступ к private переменным (ну так конечно же!) и не компилит:(
>Перенёс определения в inline всё заработало, но все же не хочет их применять по отношению к этому классу:(
>
>ps: Проделывал то же самое в Builder'e там работает.
>
>Объясните это компиллер дерьмо или я не всё учёл?

приведи пример исходного текста
а то что-то не совсем понятно
\/\/i||i
Re: Перегрузка << и >>
От: Dan  
Дата: 27.04.01 08:59
Оценка:
Здравствуйте moroz, 27.04.2001 00:53:38 вы писали:

>Есть класс для которого перегружаются операторы,

>обозначаю как friend, но компилятор VC кричит что в определении идет доступ к private переменным (ну так конечно же!) и не компилит:(
>Перенёс определения в inline всё заработало, но все же не хочет их применять по отношению к этому классу:(
>
>ps: Проделывал то же самое в Builder'e там работает.
>
>Объясните это компиллер дерьмо или я не всё учёл?
В одной из конференций писали, что нужен SP3 и выше. После установки все работает.
Re[2]: Перегрузка << и >>
От: Moroz Россия  
Дата: 27.04.01 11:20
Оценка:
Здравствуйте willi, 27.04.2001 02:24:16 вы писали:

>приведи пример исходного текста

>а то что-то не совсем понятно
class CMyClass
{
private:
int inform;
char* cStr;
public:
CMyClass() {inform = 0; cStr = NULL;}
~CMyClass();
void SetData(int i,char* inStr);
int GetInform(){return inform;}
const char* GetChar() {return cStr;}
friend ofstream& operator << (ofstream& stream, const CMyClass &SaveObj)
{
stream << inform << endl;
stream << cStr << endl;
return stream;
}
friend ifstream& operator >> (ifstream& stream, CMyClass &LoadObj)
{
char tmp[255];
stream >> inform;
stream >> tmp;
if(cStr)
delete [] cStr;
LoadObj.cStr = NULL;
LoadObj.cStr = new char(strlen(tmp)+1);
strcpy(LoadObj.cStr,tmp);
return stream;
}
};
Исходник не проблема, но если пытаюсь вызвать

CMyClass Obj;
ofs << Obj;
компиллер орет что << не определён для CMyClass

ps: Если определение вынести за класс, то access к private нельзя
Re[3]: Перегрузка << и >>
От: willi  
Дата: 27.04.01 12:29
Оценка:
Здравствуйте Moroz, 27.04.2001 05:20:06 вы писали:

Здравствуйте Moroz, 27.04.2001 05:20:06 вы писали:

вот полностью работающий пример

#include "string.h"
#include "iostream.h"

class CMyClass
{
private:
int inform;
char* cStr;
public:
CMyClass() : inform(0), cStr(NULL) {}
~CMyClass() { if(cStr) delete [] cStr; }

void SetData(int i,char* inStr)
{
inform = i;
if(cStr) delete [] cStr;
cStr = NULL;
cStr = new char[strlen(inStr)+1];
strcpy(cStr, inStr);
}

int GetInform() { return inform; }
const char* GetChar() { return cStr; }

friend ostream& operator << (ostream& stream, const CMyClass &SaveObj);
friend istream& operator >> (istream& stream, CMyClass &LoadObj);
};

ostream& operator << (ostream& stream, const CMyClass &SaveObj)
{
stream << SaveObj.inform << endl;
stream << SaveObj.cStr << endl;
return stream;
}

istream& operator >> (istream& stream, CMyClass &LoadObj)
{
char tmp[255];
stream >> LoadObj.inform;
stream >> tmp;
if(LoadObj.cStr) delete [] LoadObj.cStr;
LoadObj.cStr = NULL;
LoadObj.cStr = new char[strlen(tmp)+1];
strcpy(LoadObj.cStr, tmp);
return stream;
}


int main(int argc, char* argv[])
{
CMyClass mc;
cin >> mc;
cout << endl << mc;

return 0;
}

операторы << >> должны быть friend-ами, но не member-ами
а у тебя они были member-ами
\/\/i||i
Re[4]: Перегрузка << и >>
От: Moroz Россия  
Дата: 04.05.01 05:31
Оценка:
Здравствуйте willi, 27.04.2001 06:29:28 вы писали:

>операторы << >> должны быть friend-ами, но не member-ами

>а у тебя они были member-ами
Спасибо, загнался я....:(((0
Re[4]: Перегрузка << и >>
От: Moroz Россия  
Дата: 03.05.01 11:44
Оценка:
Здравствуйте willi, 27.04.2001 06:29:28 вы писали:

Стоит только заменить инклюды на:
#include <iostream>
using namespace std;
как тут же появятся те проблемы о которых я говорил :)

>вот полностью работающий пример

>
>#include "string.h"
>#include "iostream.h"
>
>class CMyClass
[skip]
>}
>
>операторы << >> должны быть friend-ами, но не member-ами
>а у тебя они были member-ами
OK!
Re[5]: Перегрузка << и >>
От: Черневич Василий Болеславович  
Дата: 08.05.01 07:04
Оценка:
Здравствуйте Moroz, вы писали:

M>Здравствуйте willi, 27.04.2001 06:29:28 вы писали:


M>Стоит только заменить инклюды на:

M>#include <iostream>
M>using namespace std;
M>как тут же появятся те проблемы о которых я говорил :)

Мда-а-а.
А ведь и правда проблемы. Ты прав.
Но и эти проблемы тоже можно решить.
Просто компилятор опять не может толком разобраться что за операторы << и >>.
Чтобы ему все стало понятно, надо добавить три волшебные строчки перед описанием CMyClass :)

#include <string.h>
#include <iostream>

using namespace std;

// вот эти волшебные строчки
class CMyClass;
ostream& operator<<(ostream& stream, const CMyClass& SaveObj);
istream& operator>>(istream& stream, CMyClass& LoadObj);

class CMyClass
{
...



Успехов.
\/\/i||i
Re[6]: Перегрузка << и >>
От: Nikulin Leonid Россия  
Дата: 11.05.01 05:46
Оценка:
Здравствуйте Черневич Василий Болеславович, вы писали:

ЧВБ>Но и эти проблемы тоже можно решить.

ЧВБ>Просто компилятор опять не может толком разобраться что за операторы << и >>.
ЧВБ>Чтобы ему все стало понятно, надо добавить три волшебные строчки перед описанием CMyClass :)

Так-то оно так, но позавидуешь Борланду (Builder) у них такие проблемы не возникают

ЧВБ>Успехов.
Re[7]: Перегрузка << и >>
От: Willi  
Дата: 11.05.01 06:01
Оценка:
Здравствуйте Nikulin Leonid, вы писали:

NL>Так-то оно так, но позавидуешь Борланду (Builder) у них такие проблемы не возникают


Выбирай, но осторожно, но выбирай :)

Удачи, Willi (aka Черневич Василий Болеславович :)
\/\/i||i
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.