2013-11-01 2 views
1

Я участвую в программировании, и мне объясняется необходимость перегрузки. Простой вопрос, надеюсь, я получу ответ довольно быстро. Я понимаю, что перегрузка оператора позволяет использовать его в классе. Если это так, то как мне перегрузить >> работать с классом? Я работаю на небольшую программу, чтобы проверить эту идею, и я выложу его здесьОператор перегрузки для программирования упражнений

#include <iostream> 
#include <cstdlib> 
#include "data.h" 

using namespace std; 

int main() 
{ 
    data obj; 

    cout << "What is the Number?" << endl; 
    cin >> obj; 
    system("pause"); 
    return 0; 
} 

class data 
{ 
    public: 
    data operator >> (int); 

    private: 

}; 
+1

показать нам свой код для 'класса data'. – Walter

+0

Что вы хотите делать с 'data' и для чего вы используете' >> 'for? – 0x499602D2

+0

Я просто пытаюсь понять перегрузку. Я пытаюсь прочитать переменную, которую я создаю в классе, используя перегрузку для этого. Это часть проекта, в котором я должен использовать перегрузку для чтения, вывода, сравнения и ++/- в день. Это просто доказать, что я знаю, что перегрузка – jrainey

ответ

0

Я думаю, что это то, что вы хотите.

class data 
{ 
    friend istream& operator>>(istream&, data&); 

    private: 
     int data; 
}; 

istream& operator>>(istream& in, data& d) 
{ 
    return in >> d.data; 
} 
+2

не правильно, друг должен быть оператором не istream – 4pie0

1

case1: нет необходимости получить доступ к конфиденциальным данным

data.h. 

class data { 
    public: 
    int i; 
}; 

std::ostream& operator>> (std::istream&, data&); // better make operator >> 
               // a nonmember function 
               // if it doesn't need access 
               // to private data 

data.cpp

#include "data.h" 

std::istream& operator>> (std::istream& is, data& d) { 
    is>>d.i; // here we do some logic, we do what it means to do >> on 
    return is; // an instance of your data class and return reference to istream 
} 

Вариант 2: есть необходимость получить доступ к конфиденциальным данным

data.h. 

class data { 
    private: 
    int i; 
    friend std::ostream& operator>> (std::istream&, data&); 
}; 

data.cpp

#include "data.h" 

std::istream& operator>> (std::istream& is, data& d) { 
    is>>d.i; // here we do some logic, we do what it means to do >> on 
    return is; // an instance of your data class and return reference to istream 
} 
+0

Спасибо, это указало мне в правильном направлении. оценили – jrainey

1

This page говорит вам, в основном все, что вам нужно знать о перегрузке операторов.

Короче говоря, почти каждый оператор в C++ может быть перегружен для пользовательских типов. Некоторые операторы, такие как +, -, или >>, должны быть определены вне класса, поскольку они являются свободностоящими, тогда как другие, такие как копирование (=), должны быть определены внутри.

Для вашего случая, перегрузки >> оператор может быть сделано следующим образом:

istream& operator>>(istream& in, data& d){ 
    // Code here 
    return in; 
} 

Где написано «Код здесь», поместите код, который нужно прочитать в объект данных.

Например, сделаем вид, что мы читаем объект Point с координатой x и координатой y. Он форматируется в потоке так: «(x, y)». Перегрузка оператора может выглядеть следующим образом:

istream& operator>>(istream& in, Point& p){ 
    char c; 
    in >> c; 
    if(c != '('){ 
     in.clear(ios_base::failbit); 
     return in; 
    } 
    in >> p.x >> c >> p.y >> c; 
    return in; 
} 

Это просто пример с минимальной проверкой формата, но, надеюсь, достаточно, чтобы вы начали.

Обратите внимание, что если члены в классе являются частными, то вы должны друг оператор IStream в определении класса:

class data{ 
    ... 
public: 
    friend istream& operator>>(istream&, data&); 
} 
1

Если вы хотите, чтобы укрепить ваше понимание того, что оператор перегрузка, считают, что практически все операторы на объектах (такие как «+», «++», «==», «! =» и т. д.) являются функциями-членами.

Задайте сами, чтобы узнать Obj a, b; a = b; как Obj a; Obj b; a.operator=(b);.

Перегрузка является исключительно обеспечением реализации, не использующей по умолчанию.

Вот [ужасный] перегрузка оператора * монолитно-к-сопзЬ-гольца:

class BadWolf { 
    const char* m_text; 
public: 
    BadWolf(const char* text) : m_text(text) {} 

    // if you really want the original text and ask for it with this function... 
    const char* tardisTranslation() const { return m_text; } 

    // but if you try to use me as a const char*... 
    operator const char*() const { return "bad wolf"; } 
}; 

int main(int argc, const char* argv[]) { 
    BadWolf message("hello, sweetie"); 

    std::cout << "Message reads: " << (const char*)message << std::endl; 
    std::cout << "Tardis translation: " << message.tardisTranslaction() << std::endl; 

    return 0; 
} 
Смежные вопросы