программа не вызывает нужного перегруженного оператора - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть класс Directory, который работает с объектами класса File и перегруженными операторами, например:

class Directory
{
    std::vector<char> name, timeOfCreation;
    std::vector<File> arr;

public:
    Directory(std::string);
    Directory(const Directory&);
    ~Directory();


    Directory operator += (File);
    Directory operator += (Directory);
    Directory operator -= (File);
    Directory operator ~();
    File operator [] (int);
    operator int();

    friend bool operator % (Directory, File);
    friend bool operator % (Directory, Directory);
    friend Directory operator + (Directory, Directory);
    friend Directory operator - (Directory, Directory);
    friend long int operator + (Directory);
    friend std::ofstream& operator << (std::ofstream&, Directory);

friend void main();
};

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

void main()
{
     //make object of Directory d
    std::cout << d;
}

Программа теперь вызывает оператор int () вместо оператора <<. Таким образом, команда <code>std::cout <<d действует как std::cout << (int)d и записывает количество файлов в моем каталоге.

Вот реализации операторов << и int (): </p>

Directory::operator int()
{
    return (int)arr.size();
}

std::ofstream& operator << (std::ofstream& out, Directory d)
{
    // get the max field widths for three fields
    int widthLeft = 0, widthMiddle = 0, widthRight = 10;
    std::vector<File>::const_iterator i = d.arr.begin();
    for(; i < d.arr.end(); ++i)
    {
        if((int)d.timeOfCreation.size() > widthLeft)
            widthLeft = (int)d.timeOfCreation.size();
    if((int)d.name.size() > widthMiddle)
            widthMiddle = (int)d.name.size();
    }
    out<<std::setw(widthLeft)<<"Date & Time of creation";
    out<<std::setw(widthMiddle)<<"Name";
    out<<std::setw(widthRight)<<"Total Size\n";
    return out;

}

Примечание: оператор << еще не закончен, я просто тестирую функцию setw, но она все равно должна записать эту строку. </p>

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

cout - это ostream, а не ofstream.

Должно работать:

std::ostream& operator << (std::ostream&, Directory)

Возможно, вы захотите передать каталог как ссылку.

1 голос
/ 25 ноября 2011

Ваш перегруженный << должен работать с ostream, базовым классом, а не только с ofstream:

friend std::ostream& operator << (std::ostream&, Directory const &);

std::cout не является ofstream, поэтому он не будет соответствовать вашемуперегрузки.(Также полезно передавать сложные объекты по константной ссылке, а не по значению.)

Кроме того, операторы преобразования, как правило, являются плохой идеей, поскольку они могут вводить нежелательные неявные преобразования, как вы обнаружили здесь, и потому, что ониможет запутать пользователя класса.Более разумно найти количество файлов в каталоге через именованную функцию (size(), или file_count(), или что-то еще), чем сам каталог, волшебным образом превращающийся в этот конкретный фрагмент информации.

...