【问题标题】:Operator overloading >> cin运算符重载 >> cin
【发布时间】:2017-04-30 17:52:06
【问题描述】:

我需要重载 > 运算符,但我没有看到任何错误。 当我仅重载运算符 >时,我看不到任何弹出来输入对象的变量。 这是代码,我似乎没有发现它有什么问题

#include <iostream>
#include <string.h>
#include <assert.h>
using namespace std;
class vehicle
{
protected:
    int number, year, cost;
    char *make, *model, *bodyStyle, *color;
public:
    vehicle(int = 0, int = 0, char* = NULL, char* = NULL, char* = NULL, char* = NULL, int = 0);
   ~vehicle();
    friend istream &operator>>(istream& stream,  vehicle& v);
    friend ostream &operator<<(ostream& stream, const vehicle& v);
};
vehicle::vehicle(int a, int b,  char* ma1, char* mod1, char* bs1, char* c1, int cos)
{
    number = a;
    year = b;

    make = new char[strlen(ma1) + 1];
    assert(make);
    strcpy (make,ma1);

    model = new char[strlen(mod1) + 1];
    assert(model);
    strcpy(model,mod1);

    bodyStyle = new char[strlen(bs1) + 1];
    assert(bodyStyle);
    strcpy(bodyStyle,bs1);

    color = new char[strlen(c1) + 1];
    assert(color);
    strcpy(color,c1);

    cost = cos ;
}
vehicle::~vehicle()
{
    delete[] make;
    delete[] model;
    delete[] bodyStyle;
    delete[] color;
}
istream& operator>>(istream& stream,  vehicle& v)
{
    stream>>v.number;
    stream>>v.year;
    stream>>v.cost;
    stream>>v.make;
    stream>>v.model;
    stream>>v.bodyStyle;
    stream>>v.color;
    return stream;
}
ostream& operator<<(ostream& stream, const vehicle& v)
{
    stream<<v.number<<endl;
    stream<<v.year<<endl;
    stream<<v.cost<<endl;
    stream<<v.make<<endl;
    stream<<v.model<<endl;
    stream<<v.bodyStyle<<endl;
    stream<<v.color<<endl;
    return stream;
}

class Truckvehicle : public vehicle
{
    int passengers, mileage, grossWeight, tempGross;
    char *poweredBy;
    public:
    Truckvehicle(int = 0, int = 0, char* = NULL, char* = NULL, char* = NULL, char* = NULL, int = 0, int = 0, int = 0, int = 0, char * = NULL, int = 0);
    ~Truckvehicle();
    friend ostream & operator<<(ostream& stream, const Truckvehicle& tv);
    friend istream & operator>>(istream& stream,  Truckvehicle& tv);

};

Truckvehicle::Truckvehicle(int a, int b, char* ma1, char* mod1, char* bs1, char* c1, int cos, int pass1, int mil, int gross, char* pb, int tg) :
    vehicle(a, b, ma1, mod1, bs1, c1, cos), passengers(pass1), mileage(mil), grossWeight(gross), poweredBy(pb), tempGross(tg)
{
    passengers = pass1;
    mileage = mil;
    grossWeight = gross;

    poweredBy = new char[strlen(pb) + 1];
    assert(poweredBy);
    strcpy(poweredBy, pb);

    tempGross = tg;
}

Truckvehicle :: ~Truckvehicle()
{
    delete[] poweredBy;
}
istream& operator>>(istream& stream,  Truckvehicle& tv)
{
    stream>>tv.number;
    stream>>tv.year;
    stream>>tv.make;
    stream>>tv.model;
    stream>>tv.bodyStyle;
    stream>>tv.color;
    stream>>tv.cost;
    stream>>tv.passengers;
    stream>>tv.mileage;
    stream>>tv.grossWeight;
    stream>>tv.poweredBy;
    stream>>tv.tempGross;

    return stream;
}
ostream & operator<<(ostream& stream, const Truckvehicle& tv)
{
    stream<<tv.number<<endl;
    stream<<tv.year<<endl;
    stream<<tv.make<<endl;
    stream<<tv.model<<endl;
    stream<<tv.bodyStyle<<endl;
    stream<<tv.color<<endl;
    stream<<tv.cost<<endl;
    stream<<tv.passengers<<endl;
    stream<<tv.mileage<<endl;
    stream<<tv.grossWeight<<endl;
    stream<<tv.poweredBy<<endl;
    stream<<tv.tempGross<<endl;

    return stream;
}
int main()
{
Truckvehicle TV;
//Read in the following values for TV (111111, 2014,"Toyota","Tacoma", "4X4", "Black",25000, 2, 15000,333333,"Gas", 222222);
cin>>TV;
cout<<TV;
return 0;
}

【问题讨论】:

  • “弹出”?使用std::cin 时,只需在控制台中输入即可。
  • 它只是让我 .cpp 停止工作错误
  • 看在上帝的份上,请使用 std::string。
  • 你知道如何使用调试器吗?

标签: c++ class inheritance operator-overloading


【解决方案1】:

您好,您可能想研究这段代码,它使用 GCC HEAD 8 编译器在 Wandbox 中编译时没有错误和警告。我会及时回答有关我的代码的任何问题。

问候,米查

#include <iostream>

// Don't use <blah.h>, prefer using <cblah>.
#include <cstring>
#include <cassert>

// extra includes.
#include <string>
#include <sstream>

using namespace std;

class vehicle
{
    friend ostream& operator<< (ostream& stream, vehicle const& v);
    friend istream& operator>> (istream& stream, vehicle& v);

protected:
    int number, year, cost;
    char *make, *model, *bodyStyle, *color;

public:
    vehicle(int = 0, 
            int = 0, 
            char const* = "-",    // Don't choose NULL here - prevents segmentation fault in main!
            char const* = "-", 
            char const* = "-", 
            char const* = "-", 
            int = 0);

    ~vehicle();
};

vehicle::vehicle(int a, 
                 int b, 
                 char const* ma1, 
                 char const* mod1, 
                 char const* bs1, 
                 char const* c1, 
                 int cos)
{
    number = a;
    year   = b;

    make = new char[strlen(ma1) + 1];
    assert(make);
    strcpy(make, ma1);

    model = new char[strlen(mod1) + 1];
    assert(model);
    strcpy(model, mod1);

    bodyStyle = new char[strlen(bs1) + 1];
    assert(bodyStyle);
    strcpy(bodyStyle, bs1);

    color = new char[strlen(c1) + 1];
    assert(color);
    strcpy(color, c1);

    cost = cos;
}

vehicle::~vehicle()
{
    if (make)      delete[] make;
    if (model)     delete[] model;
    if (bodyStyle) delete[] bodyStyle;
    if (color)     delete[] color;
}

ostream& operator<< (ostream& stream, vehicle const& v)
{
    stream << v.number    << endl;
    stream << v.year      << endl;
    stream << v.cost      << endl;
    stream << v.make      << endl;
    stream << v.model     << endl;
    stream << v.bodyStyle << endl;
    stream << v.color     << endl;

    return stream;
}

istream& operator>> (istream& stream,  vehicle& v)
{
    stream >> v.number;
    stream >> v.year;
    stream >> v.cost;
    stream >> v.make;
    stream >> v.model;
    stream >> v.bodyStyle;
    stream >> v.color;

    return stream;
}



class Truckvehicle : public vehicle
{
    friend ostream& operator<< (ostream& stream, Truckvehicle const& tv);
    friend istream& operator>> (istream& stream, Truckvehicle& tv);

    int  passengers, mileage, grossWeight, tempGross;
    char *poweredBy;

public:
    Truckvehicle(int = 0, 
                 int = 0, 
                 char const* = "-", 
                 char const* = "-", 
                 char const* = "-", 
                 char const* = "-", 
                 int = 0, 
                 int = 0, 
                 int = 0, 
                 int = 0, 
                 char const* = "-", 
                 int = 0);

    ~Truckvehicle();
};

Truckvehicle::Truckvehicle(int a, 
                           int b, 
                           char const* ma1, 
                           char const* mod1, 
                           char const* bs1, 
                           char const* c1, 
                           int cos, 
                           int pass1, 
                           int mil, 
                           int gross, 
                           char const* pb, 
                           int tg)
    :
    vehicle(a, b, ma1, mod1, bs1, c1, cos)
{
    passengers  = pass1;
    mileage     = mil;
    grossWeight = gross;

    poweredBy = new char[strlen(pb) + 1];
    assert(poweredBy);
    strcpy(poweredBy, pb);

    tempGross = tg;
}

Truckvehicle::~Truckvehicle()
{
    delete[] poweredBy;
}

ostream& operator<< (ostream& stream, Truckvehicle const& tv)
{
    // vehicle part.
    stream <<tv.number      <<endl;
    stream <<tv.year        <<endl;
    stream <<tv.make        <<endl;
    stream <<tv.model       <<endl;
    stream <<tv.bodyStyle   <<endl;
    stream <<tv.color       <<endl;
    stream <<tv.cost        <<endl;

    // extra truck part.
    stream <<tv.passengers  <<endl;
    stream <<tv.mileage     <<endl;
    stream <<tv.grossWeight <<endl;
    stream <<tv.poweredBy   <<endl;
    stream <<tv.tempGross   <<endl;

    return stream;
}

istream& operator>> (istream& stream, Truckvehicle& tv)
{
    // vehicle part.
    stream >>tv.number;
    stream >>tv.year;
    stream >>tv.make;
    stream >>tv.model;
    stream >>tv.bodyStyle;
    stream >>tv.color;
    stream >>tv.cost;

    // extra truck part.
    stream >>tv.passengers;
    stream >>tv.mileage;
    stream >>tv.grossWeight;
    stream >>tv.poweredBy;
    stream >>tv.tempGross;

    return stream;
}


// Simulates usage of std::operator>> ().
void initializeTruckvehicle(Truckvehicle& TV, 
                           int a, 
                           int b, 
                           char const* ma1, 
                           char const* mod1, 
                           char const* bs1, 
                           char const* c1, 
                           int cos, 
                           int pass1, 
                           int mil, 
                           int gross, 
                           char const* pb, 
                           int tg)
{
    string s;

    s += static_cast <ostringstream *> (&( ostringstream() << a )) -> str();
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << b )) -> str();
    s += " ";

    s += ma1;
    s += " ";

    s += mod1;
    s += " ";

    s += bs1;
    s += " ";

    s += c1;
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << cos   )) -> str();
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << pass1 )) -> str();
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << mil   )) -> str();
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << gross )) -> str();
    s += " ";

    s += pb;
    s += " ";

    s += static_cast <ostringstream *> (&( ostringstream() << tg    )) -> str();
    s += " ";

    istringstream in(s);
    in >> TV;
}



int main()
{
    cout << "Truck 1>" << endl;

    Truckvehicle TV1 (111111, 
                      2014, 
                      "Toyota", 
                      "Tacoma", 
                      "4X4", 
                      "Black", 
                      25000, 
                      2, 
                      15000, 
                      333333, 
                      "Gas", 
                      222222);
    cout << TV1;


    cout << "Truck 2>" << endl;

    Truckvehicle TV2;
    cout << TV2;


    cout << "Truck 3>" << endl;

    Truckvehicle TV3;
    initializeTruckvehicle (TV3, 
                            111111, 
                            2014, 
                            "Toyota", 
                            "Tacoma", 
                            "4X4", 
                            "Black", 
                            25000, 
                            2, 
                            15000, 
                            333333, 
                            "Gas", 
                            222222);
    cout << TV3;
}

【讨论】:

  • 不幸的是,您的 operator&gt;&gt; 函数将尝试覆盖 char* 参数,无论其当前大小如何,这可能是个坏消息。这就是为什么我们有std::string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2016-02-19
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多