2013-10-16 175 views
0

我有一个客户类,如下图所示C++运算符>>重载

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 
#include "SimpleDate.h" 

using namespace std; 

class Customer { 

private: 
    string customerId; 
    string name; 
    string address; 
    string city; 
    string postCode; 
    SimpleDate* dateLastPurchased; 
    double dollarsOwed; 

public: 
    //Customer(string customerIdVal, string nameVal); 
    Customer(); 
    string getCustomerId(); 
    string getName(); 
    void setAddress(string addressVal); 
    string getAddress(); 
    void setPostCode(string postCodeVal); 
    string getPostCode(); 
    void setCity(string cityVal); 
    string getCity(); 
    void setDateLastPurchased(SimpleDate* date); 
    SimpleDate* getDateLastPurchased(); 
    void addDollarsOwed(double amount); 
    double getDollarsOwed(); 

    friend ostream& operator<< (ostream &out, Customer &cust); 
    friend istream& operator>> (istream &in, Customer &cust); 
}; 

在cpp文件超载部分看起来在我的主类以下

ostream& operator<< (ostream &out, Customer &cust) 
{ 
    out << cust.customerId << "\t" << cust.name << "\t" << cust.address << "\t" << cust.city << "\t" << cust.postCode << "\t" << cust.dateLastPurchased->getFullDate() << "\t" << cust.dollarsOwed << "\t" << std::endl; 
    return out; 
} 

istream& operator>> (istream &in, Customer &cust) 
{ 
    in >> cust.customerId; 
    in >> cust.name; 
    in >> cust.address; 
    in >> cust.city; 
    in >> cust.postCode; 

    string stringData; 
    in >> stringData; 

    std::istringstream iss(stringData); 
    std::string datePart; 
    int tmp; 
    vector<int> dateData; 

    while(std::getline(iss, datePart, '/')) { 

     sscanf(datePart.c_str(), "%d", &tmp);  
     dateData.push_back(tmp); 
    } 

    SimpleDate* date = new SimpleDate(dateData[2], dateData[1], dateData[0]); 
    cust.dateLastPurchased = date; 

    string stringDollarsOwed; 
    in >> stringDollarsOwed; 

    sscanf(stringDollarsOwed.c_str(), "%lf", &cust.dollarsOwed); 

    return in; 
} 

然后我尝试创建一个客户对象为以下,

Customer* cust = new Customer(); 

    cust << customerInfo[0] << customerInfo[1] << customerInfo[2] << customerInfo[3] << customerInfo[4] << customerInfo[5] << customerInfo[6]; 

但是当我编译我碰到下面的错误,

你能帮忙吗?

谢谢。

AppManager.cpp: In member function 'Customer* AppManager::createCustomerObject(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)': 
AppManager.cpp:445: error: no match for 'operator<<' in '& cust << customerInfo.std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >](0u)' 
Customer.h:46: note: candidates are: std::ostream& operator<<(std::ostream&, Customer&) 
*** Error code 1 
make: Fatal error: Command failed for target `Tour' 
+1

您已经显示了'operator >>',但错误消息是关于'operator <<'的。你已经定义了'ostream&operator <<(ostream&,Customer&)'。您通常需要'Customer const&'。 –

回答

0

您似乎正在将customerInfo [0] etc对象插入到您创建的cust对象中。你不能像这样插入一个对象。插入/提取操作符在被重载时只能与原始数据类型一起使用,即在对象中存储和显示值。

+0

我想设置客户的属性,customerInfo [0]是一个字符串值 –

+0

如果你想从字符串中读取值到对象中,那么你需要编写一个单独的函数,它可以解析字符串(可能是你的字符串是',',' - ','_'等分隔符)并填充对象的字段。 – AquaAsh

+0

我有一个函数已经这样做:) customerInfo是一个字符串值的向量,我试图用>>来设置它们在对象中。 –

1

此操作:

ostream& operator<< (ostream &out, Customer &cust) 

允许你做不喜欢的东西

Customer c; 
std::cout << c << std::endl; 
std::ofstream output("customers.txt"); 
output << c << std::endl; 

Customer c; 
c << x; 

,绝对不是

Customer* c = ...; 
c << x; 
+0

我试图设置客户的属性,customerInfo [0]是一个字符串值 –