类中显示一个变量,但另一个不显示

时间:2018-09-02 09:14:17

标签: c++ class

编辑:完整代码: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;
}

我不确定自己在做什么错。

2 个答案:

答案 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上调用)