在类中存储指针

时间:2012-11-03 23:41:10

标签: c++ class variables pointers

我正在学习C ++并且遇到指针问题 这个简单的项目包含一张发票,里面有一个指向客户的指针。

类:

class Customer {
    string name;
public:
    Customer(string name) { this->name = name; };
    string getName() { return name; };
    void changeName(string name) { this->name = name; };
};

class Invoice {
    Customer * customer;
public:
    Invoice(Customer *customer) { this->customer = customer; };
    Customer getCustomer() { return *customer; };
};

主要

Customer *customer1 = new Customer("Name 1");
Invoice invoice1(customer1);

cout << invoice1.getCustomer().getName() << endl; //Return:Name 1;

如何使用Customer :: changeName(字符串名称)来完成这项工作:

(...) changeName("Name 2");

cout << invoice1.getCustomer().getName() << endl; //Return:Name 2;

我不知道应该用什么来改变顾客的名字。或者也许我在班级发票中做错了。

为什么要通过发票更改名称?
所以我可以学习如何在项目开始变大之前学习如何使用指针 稍后我将会有一个发票矢量和一个客户矢量。从发票或客户向量中获取指向客户的指针应该是相同的。

谢谢你,
爱德华

3 个答案:

答案 0 :(得分:7)

Customer getCustomer() { return *customer; };

应该是

Customer& getCustomer() { return *customer; };

因为在第一种情况下,您复制了客户对象,因此您的更改发生在一个被丢弃的临时对象中......

在第二个中,您将返回对您创建的对象的引用。

更改名称

string newName = "Edu";
invoice1.getCustomer().changeName( newName );

答案 1 :(得分:2)

如果你想要这种强硬,我已经在这里采取了这样的自由。客户和发票声明均已显着更新。将它们与现有代码进行比较。 不要只是将其复制到您的代码中,因为它肯定会破坏很多东西。相反,看看它,看看它是否对你有意义:

class Customer 
{
    string name;

public:
    Customer(const string& name) : name(name) {};

    const string& getName() const { return name; };
    void changeName(const string& name) { this->name = name; };
};

class Invoice 
{
    const Customer& customer;

public:
    Invoice(const Customer& customer) : customer(customer) {};

    const Customer& getCustomer() const { return customer; };
};

一般情况下(通常情况下),你应该通过指针传递一个对象的唯一次是否有对象指针 receiver 的可能性接受NULL作为有效值。否则使用引用或智能指针。不支持多态访问的对象指针数组(甚至智能指针ftw),这通常是一个很好的规则。

进行了重大更改:

  • 除非特别需要非const-access
  • ,否则使用const引用
  • 类具有初始化列表以确保成员变量的最佳构造,并且实际上现在需要Invoice,因为客户参考memeber 必须在初始化列表中初始化。

主要

Customer customer1("Name 1");
Invoice invoice1(customer1);

// note: invoice now only allows you to obtain a const-reference
//  to the customer of the invoice. As such, you can only fire
//  const-members on the returned customer reference.
cout << invoice1.getCustomer().getName() << endl; //Return:Name 1;

// without the const-ness of the getCustomer() member and the reference
//  it returns, you would have been able to do this:
//
//  invoice.getCustomer.changeName("newname");
//
// As it is written now, you can only change a customer name from
//  a non-const customer reference (or pointer), and in doing so, 
//  *all* invoices for that customer will reflect this change.
customer1.changeName("Name 2");

// note: the invoice was not changed, but the customer it references
//  was, and we should see that change now.
cout << invoice1.getCustomer().getName() << endl; //Return:Name 2;

我希望这能为您提供有关如何在项目中限制和强化对象访问权限的一些想法。

答案 2 :(得分:1)

Invoice中,返回指向Customer本身的指针,而不是其解除引用值的副本:

Customer* getCustomer() { return customer; };

然后您可以更改名称,更改将影响实际的Customer对象:

invoice1.getCustomer()->changeName("Name2")