PDA

View Full Version : مشکل در استفاده از توابع دوست



mr_esmaily
پنج شنبه 23 تیر 1384, 19:56 عصر
سلام
چرا در کد زیر تابع دوست اجازه دسترسی به اعضای خصوصی همچنین عضو ثابت MAX را ندارد ؟

class xString
{
private :
static const int MAX=25;
char str[MAX];

public :

xString(){}

xString (char Str[])
{
if(strlen(Str) < MAX)
strcpy(str,Str);
else
{
cout << "Error : Overflow" << endl;
strcpy(str,"");
}
}

void DisPlay()
{
if(strcmp(str,""))
cout << str << endl;
else
cout << "Error : xString Is NULL." << endl;
}

friend xString operator + (char [],char []) ;

};


xString operator + (char Str1[],char Str2[])
{
xString temp;

if(strlen(Str1) + strlen(Str2) < MAX)
{
strcpy(temp.str,"");
strcat(temp.str,Str1);
strcat(temp.str,Str2);
}
else
cout << "Error : Overflow" << endl;

return temp;
}

C++Lover
پنج شنبه 23 تیر 1384, 23:04 عصر
دوست عزیز باید خدمتان عرض کنم باید اطلاعات بیشتری در مورد operator overloading بدست بیاورید.
این عمل به دو صورت ممکن است در صورتی که function مربوطه را داخل خود کلاس تعریف کنید این function باید حتما nonstatic باشد و در این صورت باید فقط یک آرگومان برای operator تعریف کنید و این آرگومان همان عبارت سمت راست operator است و عبارت سمت چپ operator در واقع instance حاضر از کلاس است.
اما در صورتی که operator بصورت global و در خارج از کلاس تعریف شود باید دارای دو آرگومان باشد که اولی عبارت سمت چپ و دومی عبارت سمت راست operator است. باید در نظر داشته باشید که از این دو عبارت حتما باید یکی یا هر دو یک Instance از کلاس مورد نظر باشد و این operator باید در کلاس بصورت friend همان طوری که خودتان تعریف کردید تعریف شود.
من کلاس شما را اصلاح کردم. کد آن در زیر مشاهده کنید.



#include "stdio.h"
using namespace std;

class xString
{
private :
static const int MAX=25;
char str[MAX];

public :

xString(){}

xString (char Str[])
{
if(strlen(Str) < MAX)
strcpy(str,Str);
else
{
cout << "Error : Overflow" << endl;
strcpy(str,"");
}
}

void DisPlay()
{
if(strcmp(str,""))
cout << str << endl;
else
cout << "Error : xString Is NULL." << endl;
}

char* GetStringPointer()
{
return str;
}

xString operator = (xString xstr)
{
strcpy (str, xstr.str);
return xString(str);
}

xString operator = (char strtmp[])
{
strcpy (str, strtmp);
return xString(str);
}

friend xString operator + (xString, char[]) ;
};


xString operator + (xString xstr, char Str2[])
{
xString temp;

if((strlen(xstr.str) + strlen(Str2)) < xString::MAX)
{
strcpy(temp.str, "");
strcat(temp.str, xstr.str);
strcat(temp.str, Str2);
}
else
cout << "Error : Overflow" << endl;

return temp;
}

int _tmain(int argc, _TCHAR* argv[])
{
xString string1("Ali");
char string2[] = "Reza";
xString string3 = string1 + string2;
string3.DisPlay();
return 0;
}


امیدوارم توانسته باشم کمک کنم.

mr_esmaily
پنج شنبه 23 تیر 1384, 23:54 عصر
سلام
از راهنماییتون ممنونم.