编辑:完整代码:ideone.com/e.js/7j2zkn
我有一个Customer类:
class Customer {
public:
Customer();
Customer(string n);
Customer(string n, string add, string acct);
string display_short()const; // display customer info in format:
// Customer name: Alice
// Address: 2 North Street
string display_all()const; // display customer info in format:
// Alice, 2 North Street, 234-567
bool operator<(Customer right)const; // compares Customer data member name
string get_name()const;
private:
string name; // Multiple word name
string address;
string account_number;
};
并正在实现display_short()函数,它完美地显示了名称(减去第一个首字母缩写),但是不会显示地址,我不确定为什么。我仔细检查了拼写,发现没有问题。
string Customer::display_short()const
{
cin.clear();
cin.sync();
string shortName = name.substr(name.find(' ') + 1);
cout << "Customer name: " << shortName << endl;
cout << "Address: " << address << endl;
return shortName;
}
此函数被另一个类的另一个函数调用。
string Job::display() const
{
cin.clear();
cin.sync();
cout << endl << job_details << endl;
string name = customer.display_short();
cout << "Case handled by: ";
string handler;
getline(cin, handler);
return handler;
}
客户类既用硬编码初始化,又用用户输入的两种进行初始化,两种类型的结果相同。
这是带有硬编码地址的主要代码:
int main()
{
cout << "Loading customers... \n\n\n\n" ;
customerList.insert(Customer("D David", "1 West Street", "123-456"));
customerList.insert(Customer("A Alice", "2 North Street", "234-567"));
customerList.insert(Customer("C Carl", "3 East Street", "345-678"));
customerList.insert(Customer("Z Zoro", "4 South Street", "456-789"));
int selection;
cout << "Number of jobs for today: ";
cin >> selection;
CreateJobs(selection);
listJobs();
}
以及用户可以输入新客户的功能
// Create a record for new customer if required
void newCustomer(string cust)
{
string add;
cout << "Customer address: ";
getline(cin, add);
string acct;
cout << "Account number: ";
getline(cin, acct);
customerList.insert(Customer(cust, add, acct));
}
最后是创建新客户的代码:
Customer::Customer(string n, string add, string acct)
{
name= n;
address = add;
account_number = acct;
}
我不确定自己在做什么错。
答案 0 :(得分:0)
使Customer(string n);
构造函数明确,并为变量使用更有意义的名称。在您的代码中,您有变量cust
,该变量是一个包含客户名称而不是客户的字符串,并使用CreateJobs
函数中的隐式转换构造函数基于该名称添加了客户。
顺便说一下,您的代码在某些地方缺少const &
,以避免无用的复制。
bool operator<(Customer right)const;
应该是
bool operator<(const Customer &right) const;
相反。而且更好的是,它应该是对称性的自由函数。
因此,首先要使单参数构造函数明确,然后检查代码是否仍可编译。如果不是,请明确显示该调用,如果确实需要,则进行修复,否则可能会解决您的问题。
如果没有,请使用调试器并跟踪程序以查看何时丢失地址。
如果您真的想了解发生了什么,则可能有助于在每个构造函数中添加跟踪,并为此明确定义复制(和移动)构造函数以及赋值运算符。然后在析构函数中添加跟踪,也许还添加对象ID可能会有所帮助。
class Customer
{
static int lastId;
int id;
public:
Customer() : id(++lastId) { cout << "Creating customer " << id << endl; }
Customer(const Customer &rhs)
: name(rhs.name)
, address(rhs.address)
, account_nummber(rhs.account_number)
, id(++lastId)
{
cout << "Copying customer " << rhs.id << " to new customer " << id << endl;
}
// Other code ommited...
};
一旦您的代码被调试,您就可以删除所有多余的代码。拥有可用的代码后,请务必先复制代码。
答案 1 :(得分:0)
所以我发现问题出在我的地图上,我只是在添加带有处理程序的客户名字符串,而不是带有地址的客户对象。 我需要遍历集合并使用指针获取位置值,然后将其发送到我的工作任务图(在display_short上调用)