-
July 26th, 2012, 04:54 AM
#1
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
}
*/
-
July 26th, 2012, 05:12 AM
#2
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;
}
-
July 26th, 2012, 05:28 AM
#3
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 ==========
-
July 26th, 2012, 06:27 AM
#4
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.
-
July 26th, 2012, 11:19 PM
#5
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
Last edited by Paul McKenzie; July 26th, 2012 at 11:25 PM.
-
July 28th, 2012, 02:04 AM
#6
Re: Overloading stream operator <<. Return memory address instead object
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
-
July 28th, 2012, 02:09 AM
#7
Re: Overloading stream operator <<. Return memory address instead object
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...
-
July 28th, 2012, 02:10 AM
#8
Re: Overloading stream operator <<. Return memory address instead object
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 << "]" ;
}
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|