Overloading stream operator <<. Return memory address instead object
Subj. Try to implement overloading << operator. If I done it void then everything work fine (see comment out) if I make it class of ostream& then the operator return to me some memory address. Please help
Code:
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
#include <sstream>
class Point
{
private: // declaration of private data members
double x; // X coordinate
double y; // Y coordinate
public: // public declaration of data members (in given example haven't ) and member functions
//----------- Declaration of Constructors -----------//
Point(); // Default constructor
Point(double newX, double newY); // Constructor
Point (const Point& ObjectOfClassPoint); //COPY constructor
~Point(); //
//----------- Declaration of Accessors member functions -----------//
std::ostream& ToString() ;
//void Point::ToString () const;
};
//----------- Implementaion of Global Ostream << Operator -----------//
/*std::ostream& operator<< (std::ostream &out, Point &cPoint)
{
// SHOULD BE WITHOUT friendness
// Point's members directly.
out << cPoint.ToString();
return out;
}*/
#endif // Point_HPP
Code:
#include <iostream>
#include "Point.hpp"
int main()
{
std::cout << "\n\t ---TEST OF Operator Overloading--- \n";
Point MyPoint(1455 , 1492 ); // Creating an object of Point using constructor
Point MySecondPoint (1517 , 1796 ); // Creating an object of Point using constructor
Point MyThirdPoint (1610 , 1882 ); // Creating an object of Point using constructor
MyPoint.ToString();
MySecondPoint.ToString();
std::cout << "\n";
std::cout << "\n std::cout << MySecondPoint.ToString();;\n\n\n ";
std::cout << "\n" << MySecondPoint.ToString();
std::cout << "\n --- Now some easy math --- ";
return 0 ;
}
Code:
#include "Point.hpp"
#include <iostream>
#include <sstream>
#include <cmath>
//----------- Implementation of Constructors -----------//
Point::Point() : x(0), y(0) // Default constructor (implemented using colon syntax )
{
std::cout << "hi my default constructor\n\n\t";
}
Point::Point(double newX, double newY) : x(newX), y(newY) // Constructor
{
//std::cout << "hi my constructor\n\n\t";
}
Point::~Point() // Destructor
{
//std::cout << "bye my point..\n";
}
Point::Point (const Point& ObjectOfClassPoint) // Copy constructor
{
//std::cout << "this is COPY constructor\n\n\t ";
x = ObjectOfClassPoint.x;
y = ObjectOfClassPoint.y;
}
//----------- Implementation of Accessor(s) member functions -----------//
std::ostream& Point::ToString ()
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << " Point (" << x << ", " << y << ")\n"; // customization of output
os.str(); // str() function retrieve the string from the string buffer
return os;
}
/*void Point::ToString () const
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << " Point (" << x << ", " << y << ")"; // customization of output
std::cout << os.str()<<"\n"; // str() function retrieve the string from the string buffer
}
*/
Re: Overloading stream operator <<. Return memory address instead object
1) your ToString() function is returning a reference to a local object,
so that is incorrect from the start. Also it should return a string, not
an ostream.
2) Your code commented out operator <<, so you are not testing operator << at all.
3) Your operator should look something like this:
Code:
std::ostream& operator<< (std::ostream &out, const Point &cPoint)
{
// Point's members directly.
out << cPoint.ToString();
return out;
}
Re: Overloading stream operator <<. Return memory address instead object
Code was updated
Code:
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
#include <sstream>
class Point
{
private: // declaration of private data members
double x; // X coordinate
double y; // Y coordinate
public: // public declaration of data members (in given example haven't ) and member functions
//----------- Declaration of Constructors -----------//
Point(); // Default constructor
Point(double newX, double newY); // Constructor
Point (const Point& ObjectOfClassPoint); //COPY constructor
~Point(); //
//----------- Declaration of Accessors member functions -----------//
std::string Point::ToString ();
//void Point::ToString () const;
};
//----------- Implementaion of Global Ostream << Operator -----------//
std::ostream& operator<< (std::ostream &out, const Point &cPoint)
{
// SHOULD BE WITHOUT friendness
// Point's members directly.
out << cPoint.ToString();
return out;
}
#endif // Point_HPP
Code:
#include <iostream>
#include "Point.hpp"
#include <sstream>
int main()
{
std::cout << "\n\t ---TEST OF Operator Overloading--- \n";
Point MyPoint(1455 , 1492 ); // Creating an object of Point using constructor
Point MySecondPoint (1517 , 1796 ); // Creating an object of Point using constructor
Point MyThirdPoint (1610 , 1882 ); // Creating an object of Point using constructor
MyPoint.ToString();
MySecondPoint.ToString();
std::cout << "\n";
std::cout << "\n std::cout << MySecondPoint.ToString();;\n\n\n ";
std::cout << "\n" << MySecondPoint.ToString();
std::cout << "\n --- Now some easy math --- ";
std::cout << "\n MySecondPoint;\n\n\n ";
std::cout << MySecondPoint;
return 0 ;
}
Code:
#include "Point.hpp"
#include <iostream>
#include <sstream>
#include <cmath>
//----------- Implementation of Constructors -----------//
Point::Point() : x(0), y(0) // Default constructor (implemented using colon syntax )
{
std::cout << "hi my default constructor\n\n\t";
}
Point::Point(double newX, double newY) : x(newX), y(newY) // Constructor
{
//std::cout << "hi my constructor\n\n\t";
}
Point::~Point() // Destructor
{
//std::cout << "bye my point..\n";
}
Point::Point (const Point& ObjectOfClassPoint) // Copy constructor
{
//std::cout << "this is COPY constructor\n\n\t ";
x = ObjectOfClassPoint.x;
y = ObjectOfClassPoint.y;
}
//----------- Implementation of Accessor(s) member functions -----------//
std::string Point::ToString ()
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << "Point (" << x << ", " << y << ")"; // customization of output
return os.str(); // str() function retrieve the string from the string buffer
}
/*void Point::ToString () const
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << " Point (" << x << ", " << y << ")"; // customization of output
std::cout << os.str()<<"\n"; // str() function retrieve the string from the string buffer
}
*/
with key word cost compiler give me
1>------ Build started: Project: L4. Customizing stream operator, Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\laboratory\laboratory\l4. customizing stream operator\Point.hpp(39): error C2662: 'Point::ToString' : cannot convert 'this' pointer from 'const Point' to 'Point &'
1> Conversion loses qualifiers
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
without const
1>------ Build started: Project: L4. Customizing stream operator, Configuration: Release Win32 ------
1> Point.cpp
1>Point.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Point &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAVPoint@@@Z) already defined in main.obj
1>C:\all my\с++\Laboratory\Laboratory\Release\L4. Customizing stream operator.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Re: Overloading stream operator <<. Return memory address instead object
1) ToString() should be a const member function (you have that version
commented out ... why?)
2) You should only put the declaration of operator << in the header file. The implementation
should be in the CPP file.
Re: Overloading stream operator <<. Return memory address instead object
Code:
Point::Point (const Point& ObjectOfClassPoint) // Copy constructor
{
//std::cout << "this is COPY constructor\n\n\t ";
x = ObjectOfClassPoint.x;
y = ObjectOfClassPoint.y;
}
Sigh. Still writing copy constructors when you don't need to? I guess all that I stated in this thread didn't mean anything to you:
http://forums.codeguru.com/showthrea...t=#post2077581
When learning C++, you're supposed to build upon what you learned previously. You don't just throw away what you learn and then start fresh making the same mistakes.
This will become annoying if we spend time explaining your mistakes to you, and then you go start new discussion threads making the same mistakes we just spent our time discussing with you.
Regards,
Paul McKenzie
Re: Overloading stream operator <<. Return memory address instead object
Quote:
Originally Posted by
Paul McKenzie
Code:
Point::Point (const Point& ObjectOfClassPoint) // Copy constructor
{
//std::cout << "this is COPY constructor\n\n\t ";
x = ObjectOfClassPoint.x;
y = ObjectOfClassPoint.y;
}
Sigh. Still writing copy constructors when you don't need to? I guess all that I stated in this thread didn't mean anything to you:
http://forums.codeguru.com/showthrea...t=#post2077581
When learning C++, you're supposed to
build upon what you learned previously. You don't just throw away what you learn and then start fresh making the same mistakes.
This will become annoying if we spend time explaining your mistakes to you, and then you go start new discussion threads making the same mistakes we just spent our time discussing with you.
Regards,
Paul McKenzie
There is a rule toward my home assignments that functionality from previous exercise should be in next exercise. However, I will do delete all extra functionality before I start new thread in order do not annoy you.
Best regards,
Denis
Re: Overloading stream operator <<. Return memory address instead object
Quote:
Originally Posted by
Philip Nicoletti
1) ToString() should be a const member function (you have that version
commented out ... why?)
2) You should only put the declaration of operator << in the header file. The implementation
should be in the CPP file.
Thank you for giving attention. Of course should be const. I just made realization ToString() that return void that decide that I wanna make ToString that return string and forgot about const-ness. Silly mistake...
Re: Overloading stream operator <<. Return memory address instead object
Quote:
Originally Posted by
oteel
Code was updated
Code:
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
#include <sstream>
class Point
{
private: // declaration of private data members
double x; // X coordinate
double y; // Y coordinate
public: // public declaration of data members (in given example haven't ) and member functions
//----------- Declaration of Constructors -----------//
Point(); // Default constructor
Point(double newX, double newY); // Constructor
Point (const Point& ObjectOfClassPoint); //COPY constructor
~Point(); //
//----------- Declaration of Accessors member functions -----------//
std::string Point::ToString ();
//void Point::ToString () const;
};
//----------- Implementaion of Global Ostream << Operator -----------//
std::ostream& operator<< (std::ostream &out, const Point &cPoint)
{
// SHOULD BE WITHOUT friendness
// Point's members directly.
out << cPoint.ToString();
return out;
}
#endif // Point_HPP
Code:
#include <iostream>
#include "Point.hpp"
#include <sstream>
int main()
{
std::cout << "\n\t ---TEST OF Operator Overloading--- \n";
Point MyPoint(1455 , 1492 ); // Creating an object of Point using constructor
Point MySecondPoint (1517 , 1796 ); // Creating an object of Point using constructor
Point MyThirdPoint (1610 , 1882 ); // Creating an object of Point using constructor
MyPoint.ToString();
MySecondPoint.ToString();
std::cout << "\n";
std::cout << "\n std::cout << MySecondPoint.ToString();;\n\n\n ";
std::cout << "\n" << MySecondPoint.ToString();
std::cout << "\n --- Now some easy math --- ";
std::cout << "\n MySecondPoint;\n\n\n ";
std::cout << MySecondPoint;
return 0 ;
}
Code:
#include "Point.hpp"
#include <iostream>
#include <sstream>
#include <cmath>
//----------- Implementation of Constructors -----------//
Point::Point() : x(0), y(0) // Default constructor (implemented using colon syntax )
{
std::cout << "hi my default constructor\n\n\t";
}
Point::Point(double newX, double newY) : x(newX), y(newY) // Constructor
{
//std::cout << "hi my constructor\n\n\t";
}
Point::~Point() // Destructor
{
//std::cout << "bye my point..\n";
}
Point::Point (const Point& ObjectOfClassPoint) // Copy constructor
{
//std::cout << "this is COPY constructor\n\n\t ";
x = ObjectOfClassPoint.x;
y = ObjectOfClassPoint.y;
}
//----------- Implementation of Accessor(s) member functions -----------//
std::string Point::ToString ()
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << "Point (" << x << ", " << y << ")"; // customization of output
return os.str(); // str() function retrieve the string from the string buffer
}
/*void Point::ToString () const
{// Function ToString should also be const also because of reason of mistaken modification of an object's value
std::ostringstream os; // std::stringstream object
os << " Point (" << x << ", " << y << ")"; // customization of output
std::cout << os.str()<<"\n"; // str() function retrieve the string from the string buffer
}
*/
with key word cost compiler give me
1>------ Build started: Project: L4. Customizing stream operator, Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\laboratory\laboratory\l4. customizing stream operator\Point.hpp(39): error C2662: 'Point::ToString' : cannot convert 'this' pointer from 'const Point' to 'Point &'
1> Conversion loses qualifiers
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
without const
1>------ Build started: Project: L4. Customizing stream operator, Configuration: Release Win32 ------
1> Point.cpp
1>Point.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Point &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAVPoint@@@Z) already defined in main.obj
1>C:\all my\с++\Laboratory\Laboratory\Release\L4. Customizing stream operator.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Correct solution:
Put to Point.cpp
Code:
//----------- Implementation of GLOBAL Ostream << Operator -----------//
std::ostream& operator << (std::ostream& out, Point const& ObjPoint)
{
return out << "[" << ObjPoint.x << "," << ObjPoint.y << "]" ;
}
std::ostream& operator << (std::ostream& out, Point const *objPoint)
{
return out << "[" << objPoint->x << "," << objPoint->y << "]" ;
}