2012-02-12 8 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; 
} 

なぜカントこの作品で私の実装ファイルに

のですか? Imは、このエラーに

エラーC2248取得:

万人をプライベートメンバにアクセスすることはできませんクラスで宣言 'のstd :: basic_ios < _Elem、_Traits>': 'のstd :: basic_ios < _Elem、_Traits> :: basic_ios' をありがとう!エラーが修正されました!そのオブジェクトのコピーコンストラクタがプライベートであるため、あなたはstd::coutstd::cinstd::cerr、またはstd::ios_base由来の他のオブジェクトのコピーを作成することはできません

+0

わからないことが(詳細に見なくても)動作していないですが、あなたは同じようにあなたのクラスでの99.9999%をI/Oの実装を検討することをお勧めします理由C++コーダーはそうです。これにより、C++の半分のコーディングとCの半分のコーディングではなく、 'operator <<'を使用しています:-) – paxdiablo

答えて

2

...あなたがするために、参照することによりios_baseから派生したすべてのストリームオブジェクトを渡す必要がありますコピーコンストラクタの呼び出しを防ぎます。したがって、あなたの関数のシグネチャ:

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

に少なくとも変化に

void MyString::print(ostream a); 

ニーズ理由はprint試行への呼び出しが許可されていない出力ストリームを、コピーすることです。あなたはリファレンスとして引数を取るように機能を変更している:

void MyString::print(ostream &a) 
関連する問題