-1

I am a Java developer. When I need to put a reference attribue in my class, I do this:

public class Account{
    private int num;
    private Person client;
}

But now, I have to do the same in C++

How can I do that in .h file?

Actually I just have the num attribute:

class Account{
    private:
            int num;
    public:
            Account(int num);
            ~Account();
            int getNum();
            void setNum(int num);
}

How should I put the Person attribute below and how should I compile it? Thanks.

4

4 回答 4

6

至少有 4 种方法可以做到这一点:

  1. 使用指针 ( Person*),这是大多数 C 和 C++ 程序员可能会做的事情,但由于某些充分的原因,它被许多人所反对。当不再需要对象时,您需要注意删除它(如果多个对象可能引用同一个对象,这可能很重要),并且在使用它之前必须确保指针有效(可怕的空指针) .
  2. 使用引用( Person&),这将要求您在Account构造时初始化引用,并且您不能在对象的生命周期中稍后更改它。与指针不同,使用引用“看起来像”使用普通变量。
    在您的情况下,无法重新设置引用的限制可能是一个问题,因为可以想象一个帐户被另一个人占用(例如,如果原始所有者去世)。在这种情况下,您必须删除该Account对象并在其位置创建一个新对象。从积极的方面来说,引用保证是有效的(除非你特别恶意并且真的试图欺骗编译器)。
  3. 使用 a shared_ptr<Person>,如果你想拥有一个引用计数的垃圾收集,这与你在 Java 中拥有的不同。许多Account对象可以共享相同的Person,并且当引用计数变为零时,它将被删除。
  4. 只需使用 a Person,这将创建一个副本,可能不是您想要的,除非每个Person都只被一个引用Account(不太可能,人们通常有多个帐户)。
于 2013-05-27T19:13:41.300 回答
1

这取决于你想要什么,在 C++ 中,你必须说比在 Java 中更具体地说,Java 中的一切都是垃圾收集的引用。您可能不希望帐户“拥有”客户(例如,当帐户被删除时,相应的人(或其副本)被删除),所以

class Account { Person client; /* ... */ };

是正确的(如果您确实希望帐户拥有他们的客户,那么完全可以,就这样做)所以您可能需要一个指针。

class Account { Person* client; /* ... */ };

那么被引用的 Person 的“所有者”是/应该负责它的删除(也可能是它的创建),并且必须确保(即必须通过程序的结构确保它)在它被删除时没有悬空指针保留destroyed:这正是所有权的含义,当你来自 Java 时,这种想法可能对你来说是新的。

如果您无法确定 Person 的不同所有者,即它具有共享所有权,则使用std::shared_ptr<Person>它是一个引用计数的智能指针,它将在指向对象的所有shared_ptrs 都被销毁时销毁(如果使用正确,它就是与垃圾收集最相似的东西,您将在标准 C++ 中获得,但请记住,如果您有循环引用,则需要使用std::weak_ptr.

于 2013-05-27T19:23:48.050 回答
0

你不必做任何特别的事情,真的:

class Account{
    int num;
    Person client;
public:
    Account(int num);
    ~Account();
    int getNum();
    void setNum(int num);
};

这是创建一个对象(一个值)而不是一个引用,但完全不清楚您是否真的想要/需要一个引用(即,您可能会,但同样您可能不会)。根据具体情况,您可能需要Person &client;(尽管这很少需要)或Person *client;(它创建一个指针,而不是引用,但话说回来,Java 的引用主要是“拒绝指针”)。指针和引用之间的基本区别(这些术语在 C++ 中使用)是可以分配指针,但只能初始化引用。这意味着(除其他外)如果您的Account类包含引用成员,则可能无法有意义地支持 Account 类的分配。可以分配指针。

另外,仔细检查你的getNumsetNum仔细看看它们是否真的完成了任何有用的事情——如果它们就像大多数 Java 中的访问器/修改器一样,那么没有它们你可能会更好。

于 2013-05-27T19:08:40.960 回答
0

对于引用,您可能需要一个 Person *,它是一个指向人员对象的人员指针。在 java 中,除了原语之外的所有东西都是 c++ 中的引用,您可以拥有值、指针和引用对象(由 & 指定)。 Person * client;是代码

于 2013-05-27T19:07:04.697 回答