程序没有调用正确的重载运算符

时间:2011-11-24 22:43:02

标签: c++ operators operator-overloading overloading

我的类目录使用类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()而不是运算符&lt;&lt;。这样命令  std::cout <<d的行为类似于std::cout << (int)d,它会写出我目录中的文件数量。

以下是运算符的实现&lt;&lt;和int():

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;

}

注意:运营商&lt;&lt;尚未完成,我只是测试setw函数,但它仍然应该写出一行。

2 个答案:

答案 0 :(得分:3)

coutostream,而不是ofstream

应该工作:

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

您可能希望将目录作为参考传递。

答案 1 :(得分:1)

您的重载<<应该与基类ostream一起使用,而不仅仅是ofstream

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

std::cout不是ofstream,因此无法与您的超载相匹配。 (通过常量引用而不是值传递复杂对象也是一个好主意。)

此外,转换运算符通常是一个坏主意,因为它们可能会引入您在此处找到的不必要的隐式转换,并且因为它们可能会混淆类的用户。通过命名函数(size()file_count()或其他)找到目录中的文件数比通过神奇地改变为特定信息的目录本身更有意义。 / p>