PDA

View Full Version : مشکل در override کردن >> برای خروجی cout



zehs_sha
شنبه 23 فروردین 1393, 22:32 عصر
سلام دوستان من کد زیر را نوشتم که از خط زیر ایراد می گیرد
ostream& String::operator<<(ostream& stream,const String& str){
کل کد
#include <iostream>
#include <cstring>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

class String{
char *ch;
public:
String();
String operator=(char* ob);
String operator+(String str);
char * toString();
friend ostream& operator<<(ostream& stream,const String& str);
};

String::String(){
}

String String::operator=(char* ob){
ch=ob;
return *this;
}

String String::operator+(String str){
String temp;
temp.ch=strcpy(ch,str.ch);
return temp;
}
ostream& String::operator<<(ostream& stream,const String& str){
stream<<str.ch;
return stream;
}

char * String::toString(){
return ch;
}

int main(int argc, char *argv[]) {
String str1,str2,str3;
str1="ehsan";
str2="shahbakhty";
cout<<str2;
return 0;
}



خطای زیر تولید می شود :

[Error] 'std::ostream& String::operator<<(std::ostream&, const String&)' must take exactly one argument

حامد مصافی
شنبه 23 فروردین 1393, 22:57 عصر
متن خطا میگه "اوپراتور >> باید دقیقا یک پارامتر بپذیرد" که منطقی هم هست!

zehs_sha
یک شنبه 24 فروردین 1393, 02:24 صبح
بله پبغام خودم خوندم ! خوب راه حل چیه ؟ من می خواهم این >> را پیاده سازی کنم ؟

پس احتمالا این لینک هم میکروسافت غیر منطقی رفته :
http://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx

حامد مصافی
یک شنبه 24 فروردین 1393, 18:42 عصر
این راه مایکروسافت یک تابع خارج از کلاس است. اما تابع شده داخل کلاس است. در مورد اوپراتور‌هایی که داخل کلاس هستند یک طرف اوپریت خود کلاس در نظر گرفته می‌شود.
من نمیدونم شما باید چطور این متد را پیاده سازی کنید، چون نمیدانم قرار است از نظر منطقی چه اتفاقی در آن بیفتد. لطفا بفرمایید چه کاری قرار است این تابع انجام دهد؟

java4me
یک شنبه 24 فروردین 1393, 21:04 عصر
خط ۱۶ رو ببرید بالای عبارت public (یعنی قبل از پابلیک)درست میشه....!

rahnema1
یک شنبه 24 فروردین 1393, 21:36 عصر
سلام

ostream& operator<<(ostream& stream,const String& str){
stream<<str.ch;
return stream;
}


قراره اپراتور موجود در کلاس ostream دوباره override بشه نه اپراتور موجود در کلاس string
وقتی به عنوان friend اعلان کردید یعنی این اپراتور عضوی از کلاس ostream هست و قراره به اعضای private کلاس String دسترسی داشته باشه
پس هنگام تعریف این اپراتور دقت کنید این اپراتور عضوی از کلاس ostream هست

حامد مصافی
یک شنبه 24 فروردین 1393, 22:12 عصر
خط ۱۶ رو ببرید بالای عبارت public (یعنی قبل از پابلیک)درست میشه....!

اوپراتوری که private باشه اوپراتور نیست!

omid_kma
دوشنبه 25 فروردین 1393, 00:56 صبح
داخل کد شما اپراتور بصورت عضوی از کلاس تعریف شده .
شما باید اپراتور گلوبال >> رو overload کنی اون operator ای که نوشتی عضو کلاس هست و برای این استفاده میشه >>String

این جا هم قبلا بحث شده بود : نوشتن یک کلاس بوسیله cout (http://www.7khatcode.com/index.php?qa=1804&qa_1=%D9%86%D8%AD%D9%88%D9%87-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%DB%8C%DA%A9-%DA%A9%D9%84%D8%A7%D8%B3-%D8%A8%D9%88%D8%B3%DB%8C%D9%84%D9%87-cout&show=1804#q1804)