Форум программистов, компьютерный форум CyberForum.ru

Перегрузка потокового оператора (<<). Выдает адрес вместо значения - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
26.07.2012, 13:49     Перегрузка потокового оператора (<<). Выдает адрес вместо значения #1
Сабж. Все компелится нормально. Если делать << void то работает ок см комменты
если делать класса std::ostream& то возвращает 16чное значение.
Заранее спасибо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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 ; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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
    }
    */
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 13:49     Перегрузка потокового оператора (<<). Выдает адрес вместо значения
Посмотрите здесь:

перегрузка оператора = C++
C++ Перегрузка оператора +
Перегрузка оператора == C++
C++ Перегрузка оператора ->
Перегрузка оператора [] C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2012, 14:11     Перегрузка потокового оператора (<<). Выдает адрес вместо значения #2
Цитата Сообщение от Leeto Посмотреть сообщение
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;
}
C++
1
2
3
4
5
6
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
}
Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
std::ostream& operator<< (std::ostream &out, Point &cPoint)
C++
1
std::ostream& operator << (std::ostream &out, Point const& cPoint)
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
26.07.2012, 14:21  [ТС]     Перегрузка потокового оператора (<<). Выдает адрес вместо значения #3
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
2
3
4
5
6
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
}
Добавлено через 1 минуту

C++
1
std::ostream& operator << (std::ostream &out, Point const& cPoint)


А как мне теперь сделать так чтобы сразу можно было объект MySecondPoint послать на cout <<
Компилятор выдает Link error

C++
1
2
3
4
5
6
7
8
9
std::ostream& operator<< (std::ostream &out, Point &cPoint) 
{
    // SHOULD BE WITHOUT friendness 
    // Point's members directly.
 
    out << cPoint.ToString();
        
    return out;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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 --- ";
 
    std::cout << "\n MySecondPoint;\n\n\n ";
    std::cout << MySecondPoint;
    
 
  return 0 ; 
}
PS В этом задании нельзя френдить и надо использовать ToString() и надо чтобы operator << be Global но реализован внутри hpp


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

fatal error LNK1169: one or more multiply defined symbols found
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2012, 14:54     Перегрузка потокового оператора (<<). Выдает адрес вместо значения #4
point.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
#include <ostream>
#include <string>
    
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 ToString() const;    
};
 
 
//----------- Declaration of Global Ostream << Operator  -----------//
 
std::ostream& operator<< (std::ostream& out, Point const& cPoint); 
 
#endif // Point_HPP


Добавлено через 19 секунд

point.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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() 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 << ")\n";        // customization of output 
    return os.str();                                    // str() function retrieve the string from the string buffer
}
 
std::ostream& operator << (std::ostream& out, Point const& cPoint)
{
    // SHOULD BE WITHOUT friendness 
    // Point's members directly.
    return (out << cPoint.ToString());
}

Добавлено через 20 секунд

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 
    
    std::cout << MyPoint << std::endl
        << MySecondPoint << std::endl
        << MyThirdPoint  << std::endl;
 
  return 0 ; 
}
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
26.07.2012, 15:38  [ТС]     Перегрузка потокового оператора (<<). Выдает адрес вместо значения #5
Цитата Сообщение от Jupiter Посмотреть сообщение
point.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
#include <ostream>
#include <string>
    
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 ToString() const;    
};
 
 
//----------- Declaration of Global Ostream << Operator  -----------//
 
std::ostream& operator<< (std::ostream& out, Point const& cPoint); 
 
#endif // Point_HPP


Добавлено через 19 секунд

point.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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() 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 << ")\n";        // customization of output 
    return os.str();                                    // str() function retrieve the string from the string buffer
}
 
std::ostream& operator << (std::ostream& out, Point const& cPoint)
{
    // SHOULD BE WITHOUT friendness 
    // Point's members directly.
    return (out << cPoint.ToString());
}

Добавлено через 20 секунд

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 
    
    std::cout << MyPoint << std::endl
        << MySecondPoint << std::endl
        << MyThirdPoint  << std::endl;
 
  return 0 ; 
}

Спасибо большое !
Yandex
Объявления
26.07.2012, 15:38     Перегрузка потокового оператора (<<). Выдает адрес вместо значения
Ответ Создать тему
Опции темы

Текущее время: 11:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru