C ++ Simple Cout Ostream - PullRequest
       30

C ++ Simple Cout Ostream

2 голосов
/ 12 февраля 2012
#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;
    }

выше есть в моем файле реализации

Это в моем основном файле

 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>'

Миллион Спасибо!ОШИБКА ИСПРАВЛЕНА !!

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Причина в том, что вызов print пытается скопировать выходной поток, что недопустимо.Вы изменили функцию, чтобы принимать аргумент в качестве ссылки:

void MyString::print(ostream &a)
2 голосов
/ 12 февраля 2012

Вы не можете сделать копию std::cout, std::cin, std::cerr или любого другого объекта, полученного из std::ios_base, так как конструктор копирования для этого объекта является личным ... вы должны передать все производные объекты потокаот ios_base по ссылке, чтобы предотвратить вызов конструктора копирования.Таким образом, ваша подпись функции:

void MyString::print(ostream a);

должна по крайней мере измениться на

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