3
votes
#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;
    }

the above is in my implementation file

This is in my main file

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

Why cant this work? Im getting this error

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

Million Thanks! ERROR FIXED!!

2
Not sure why that's not working (without looking in detail) but you may want to consider implementing I/O on your class the same way 99.9999% of C++ coders do. By that, I mean with operator<< rather than half coding in C++ and half in C :-) - paxdiablo

2 Answers

3
votes

You cannot make a copy of std::cout, std::cin, std::cerr, or any other object derived from std::ios_base since the copy-constructor for that object is private ... you must pass all stream objects derived from ios_base by reference in order to prevent invocation of the copy-constructor. Thus your function signature:

void MyString::print(ostream a);

needs to at least change to

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

The reason is that the call to print tries to copy the output stream, which is not allowed. You have change the function to take the argument as a reference:

void MyString::print(ostream &a)