2012-02-12 65 views
2
#include"MyString.h" 
#include<iostream> 
    MyString::MyString()//default constructor 
    { 
     length=0; 
     data=NULL; 
     cout<<"Default called by right none is called"<<endl; 
     system("pause"); 
    } 
    MyString::MyString(char *source)//cstyle string parameter 
    { 
     int counter=0; 
     //we implement count without using getlen 
     for(int i=0;(source[i])!='\0';i++)//assume their char string is terminated by null 
     { 
      counter++; 
     } 
     length=counter; 
     cout<<"THE LENGTH of "<<source<<" is "<<counter<<endl; 
     system("pause"); 
     data = new char[length]; 
    } 
    void MyString::print(ostream a)//what to put in besides ostream 
    { 
     a<<data; 
    } 

上面是我在執行文件C++簡單的cout的ostream

這是我的主文件

int main() 
{ 
    MyString s1("abcd");// constructor with cstyle style array 
    s1.print(cout); 
    system("pause"); 
    return 0; 
} 

爲什麼不能這項工作? 即時得到這個錯誤

錯誤C2248: '的std :: basic_ios < _Elem,_Traits> :: basic_ios':不能訪問類中聲明私有成員 '的std :: basic_ios < _Elem,_Traits>'

萬元謝謝!錯誤固定!

+0

不知道爲什麼不工作(不看詳細),但你可能要考慮你的類實現I/O以同樣的方式99.9999% C++編碼器呢。因此,我的意思是用'operator <<'而不是C++的一半編碼,C :-的一半 – paxdiablo 2012-02-12 04:23:39

回答

2

你不能做的std::cout副本,std::cinstd::cerr,或任何其他對象從std::ios_base衍生自拷貝構造函數,該對象是私有的......你必須參照爲了傳遞來自ios_base衍生的所有流對象阻止複製構造函數的調用。因此,你的函數簽名:

void MyString::print(ostream a); 

需要至少改變

void MyString::print(ostream& a); 
2

的原因是調用print嘗試到輸出流,這是不允許的複製。你必須改變函數取參數作爲參考:

void MyString::print(ostream &a)