/////////////////////////////////////////////////////////////// // MT2Q3.cpp - assignment for class with reference member // // // // Jim Fawcett, CSE687 - OOD Midterm, Spring 2013 // /////////////////////////////////////////////////////////////// #include #include #include #include #include "../MTutility/MTutility.h" class X { public: X(const std::vector& strs, std::ostream& out=std::cout) : stuff(strs), out_(out) {} X(const X& x) : stuff(x.stuff), out_(x.out_) {} // this is what compiler generated cctor does X& operator=(const X& x) // compiler can't generate assignment due to reference member { if(this == &x) return *this; // can't assign reference member out_ stuff = x.stuff; return *this; } void write() { for(auto character : stuff) { out_ << "\n " << character; } } private: std::ostream& out_; std::vector stuff; }; int main() { Title("MT2Q3 - Assignment for class with reference member"); std::vector threeStooges; threeStooges.push_back("Larry"); threeStooges.push_back("Moe"); threeStooges.push_back("Curly"); X x(threeStooges); x.write(); std::cout << "\n copying"; X xcopy(x); xcopy.write(); std::vector threeMuskateers; threeMuskateers.push_back("Athos"); threeMuskateers.push_back("Porthos"); threeMuskateers.push_back("Aramis"); std::ofstream fout("test.dat"); if(fout.good()) { X fx(threeMuskateers,fout); std::cout << "\n writing to file"; fx.write(); std::cout << "\n copying"; X fxcopy(fx); fxcopy.write(); fout.close(); std::ifstream fin("test.dat"); if(fin.good()) { std::cout << "\n reading from file"; std::cout << fin.rdbuf(); } std::cout << "\n assigning"; x = fx; // will use x's original ostream, e.g., cout x.write(); } std::cout << "\n\n"; return 0; }