Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator >> и <<, перегрузка для своего класса 
V
    Опции темы
compiler91
Дата 7.7.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.6.2008
Где: Харьков, Украина

Репутация: нет
Всего: нет



Добрый день!
Пишу свой календарь, но возникли вопросы с перегрузкой операторов >> и << smile 
На форуме уже встречались такие вопросы, но я чего-то недо понимаю smile 

В атаче три файла: index.cpp - файл с main(). А в date.h и date.cpp реализован мой класс..

ошибки:
error: no matching function for call to ‘date::print(std::ostream*)’    date    date.h    line 42
error: no matching function for call to ‘date::scan(std::istream*)’    date    date.h    line 47

компилятор: g++
ос: linux

Помогите пожалуйста..
заранее благодарен.


Это сообщение отредактировал(а) compiler91 - 7.7.2008, 22:33

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  date.zip 1,71 Kb
PM MAIL   Вверх
Lazin
Дата 7.7.2008, 23:06 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



напиши

Код

inline std::ostream& operator << (std::ostream& os, date &d){
    return d.print(os);            
    


inline std::ostream& operator >> (std::istream& is, date &d){
    return d.scan(is);                
}

вместо
Код

inline std::ostream& operator << (std::ostream& os, date &d){
    return d.print(&os);            //<<===================================error!!!
    


inline std::ostream& operator >> (std::istream& is, date &d){
    return d.scan(&is);                //<<===================================error!!!
}

твоя ошибка в том, что ты вместо ссылки пытаешься передать указатель

Добавлено через 1 минуту и 38 секунд
зы
inline там можно не писать...

Добавлено через 3 минуты и 20 секунд
ззы
по хорошему нужно использовать const если не изменяешь параметр

Код

std::ostream& operator << (std::ostream& os, const date &d)
{
    return d.print(os);            
}

PM MAIL Skype GTalk   Вверх
T0ohtik
Дата 7.7.2008, 23:22 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: 1
Всего: 1



Ошибка заключается в том, что ты вместо ссылку передаешь указатель.
Надо написать так:
Код

inline std::istream& operator >> (std::istream& is, date &d)
{
    return d.scan(is);                
}

И оператор Scan можно немного упростить
Код

std::istream& date::scan(std::istream & is)
{
    is >> _hour;    
    is >> _minute;
    is >> _seconde;    
    is >> _day;        
    is >> _month;    
    is >> _year;    
    return is;
}


Добавлено через 1 минуту и 9 секунд
упс, я не первый:(
PM MAIL   Вверх
compiler91
Дата 8.7.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.6.2008
Где: Харьков, Украина

Репутация: нет
Всего: нет



Спасибо большое! Паралельно нашел еще несколько ошибок.. Если выйдет что-то путное, может, потом выложу...
---
просьба повысить репутацию отвечающим.

Это сообщение отредактировал(а) compiler91 - 8.7.2008, 12:53
PM MAIL   Вверх
anatox91
Дата 8.7.2008, 13:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



Цитата(compiler91 @  8.7.2008,  12:52 Найти цитируемый пост)
просьба повысить репутацию отвечающим.

сделано smile


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
pycha
Дата 8.7.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



драсте. У меня чтото с перегрузкой символа << непонятное . Прога переписана с книги. Выдает ошибки

g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\11.13\11.13\11.13.cpp(115) : error C2556: 'std::ostream &VECTOR::operator <<(std::ostream &,const VECTOR::Vector &)' : overloaded function differs only by return type from 'std::ostream VECTOR::operator <<(std::ostream &,const VECTOR::Vector &)'
        g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\11.13\11.13\vector.h(35) : see declaration of 'VECTOR::operator <<'
g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\11.13\11.13\11.13.cpp(115) : error C2040: 'VECTOR::operator <<' : 'std::ostream &(std::ostream &,const VECTOR::Vector &)' differs in levels of indirection from 'std::ostream (std::ostream &,const VECTOR::Vector &)'

вот клас:
Код

#ifndef _VECTOR_H_
#define _VECTOR_H_
namespace VECTOR
{
    class Vector
    {
    private:
        double x;
        double y;
        double mag;
        double ang;
        char mode;
        void set_mag();
        void set_ang();
        void set_x();
        void set_y();
    public:
        Vector();
        Vector(double n1, double n2, char form='r');
        void set(double n1, double n2, char form='r');
        ~Vector();
        double xval()const{return x;}
        double yval()const{return y;}
        double magval()const{return mag;}
        double angval()const{return ang;}
        void polar_mode();
        void rect_mode();

        Vector operator+(const Vector & b) const;
        Vector operator-(const Vector &b) const;
        Vector operator-() const;
        Vector operator*(double n) const;

        friend Vector operator*(double n, const Vector &a);
        friend ostream operator << (ostream & os, const Vector & v);
    };
}
#endif


А вот и сама проблемная функция:

Код

ostream&operator<<(ostream&os,const Vector&v)
{
    if(v.mode=='r')
        os<<"(x,y)=("<<v.x<<", "<<v.y<<")";
    else if (v.mode =='p')
        os<<"(m,a = ("<<v.mag<<", "<<v.ang*Rad_to_deg<< ")";
    else
        os<<"Vector object mode is invalid";
    return os;
}

Переписано точь в точь. Обьясните почему не хочет перегружатся? Компилятор Visual C++ 2008 Express Edition
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
compiler91
Дата 8.7.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.6.2008
Где: Харьков, Украина

Репутация: нет
Всего: нет



anatox91, спасибо..

тему оставляю не решеной  в связи с вопросом от pycha...

pycha
посмотри тему того же anatox91 smile , может поможет...
PM MAIL   Вверх
Lazin
Дата 8.7.2008, 14:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



функция возвращает ссылку
Цитата(pycha @  8.7.2008,  13:58 Найти цитируемый пост)
ostream& operator<<(ostream & os, const Vector & v)



а здесь ошибка, функция возвращает значение...
Цитата(pycha @  8.7.2008,  13:58 Найти цитируемый пост)
friend ostream operator << (ostream & os, const Vector & v);



Это сообщение отредактировал(а) Lazin - 8.7.2008, 14:56
PM MAIL Skype GTalk   Вверх
pycha
Дата 9.7.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: 1
Всего: 13



Да, действительно недоглядел. Спасибо за помощь.
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
fearuth
Дата 26.12.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.9.2008

Репутация: нет
Всего: 1



привет, у меня проблемы с перегрузкой выше упомянутых операторов...

заголовочный файл elpoint.h

Код

#ifndef _elpoint_h
#define _elpoint_h

#include <NTL/ZZ.h>
#include <iostream>

using namespace NTL;
using namespace std;

namespace EL
{
    class ELP
    {
        ZZ x,y,a,b,N;
        public:
            void setX(ZZ);
            void setY(ZZ);
            void setA(ZZ);
            void setB(ZZ);
            void setN(ZZ);
            ELP();
            ELP(ZZ,ZZ,ZZ,ZZ,ZZ);
            ELP operator+(const ELP&);
            ELP operator-(const ELP&);
            bool operator==(const ELP&);
            ELP & operator=(ELP);
            friend std::ostream& operator<<(std::ostream & , const ELP &);
            friend std::istream& operator>>(std::istream & , ELP &);
    };
}
#endif


Далее файл с описанием elpoint.cpp

Код

#include "elpoint.h"

using namespace EL;

ELP::ELP()
{
    this->x=to_ZZ("0");
    this->y=to_ZZ("0");
    this->a=to_ZZ("0");
    this->b=to_ZZ("0");
    this->N=to_ZZ("0");
}

ELP::ELP(ZZ X, ZZ Y, ZZ A, ZZ B, ZZ NN)
{
    this->x=X;
    this->y=Y;
    this->a=A;
    this->b=B;
    this->N=NN;
}

void ELP::setX(ZZ x)
{
    this->x=x;
}

bool ELP::operator==(const ELP & A)
{
    if(this->x==A.x && this->y==A.y) return true;
    return false;
}

ELP & ELP::operator=(ELP A)
{
    this->x=A.x;
    this->y=A.y;
    this->a=A.a;
    this->b=A.b;
    this->N=A.N;
    return *this;
}

ELP ELP::operator+(const ELP & A)
{
    ELP B,C(this->x,this->y,this->a,this->b,this->N);
    ZZ lmd,c,r,r1;
    if(C==A)
    {
        XGCD(c,r,r1,to_ZZ("2")*this->y,this->N);
        lmd=((to_ZZ("3")*this->x*this->x+this->a)*r)%this->N;
        cout<<(to_ZZ("3")*this->x*this->x+this->a)<<"/"<<(to_ZZ("2")*this->y)<<"="<<(to_ZZ("3")*this->x*this->x+this->a)<<"*(("<<(to_ZZ("2")*this->y)<<"*"<<r<<"+"<<this->N<<"*"<<r1<<")/"<<to_ZZ("2")*this->y<<")="<<lmd<<" mod "<<this->N<<endl;
    }
    else
    {

    }
    return B;
}

istream & operator>>(istream & sm, ELP & AA)
{
    ZZ X;
    sm>>X;
    AA.setX(X);
    return sm;
}

std::ostream & operator<<(std::ostream & out, const ELP & AA)
{
    out<<"("<<324<<")";
    return out;
}


конечный файл el.cpp:

Код

#include <iostream>
#include <NTL/ZZ.h>
#include "elpoint.h"

using namespace std;
using namespace NTL;
using namespace EL;

int main(int argc,char * argv[])
{
    ELP a,b(to_ZZ("188"),to_ZZ("93"),to_ZZ("-1"),to_ZZ("1"),to_ZZ("751")),c;
    cout<<b;
    c=a+b;
    return 0;
}



Makefile:

Код

OBJ = elpoint.o el.o
LIBS = -lntl
el: $(OBJ)
    g++ -o el $(OBJ) $(LIBS)


При компиляции выдает ошибку:

g++    -c -o elpoint.o elpoint.cpp                                                                                              g++ -o el elpoint.o el.o -lntl                                                                                          el.o: In function `main':
el.cpp:(.text+0x62f): undefined reference to `EL::operator<<(std::basic_ostream<char, std::char_traits<char> >&, EL::ELP&)'
collect2: ld returned 1 exit status
make: *** [el] Ошибка 1


В чем может быть ошибка... Подскажите...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1338 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.