指针和循环依赖

时间:2013-12-23 17:47:35

标签: c++ pointers

我正在尝试进入C ++,但我遇到了一些问题。我的两个班级看起来像这样:

#include "Account.h"

class Program
{
public:
    Program(void);
    ~Program(void);
    void SetAccount(Account account);
};

#include "Program.h"

class Account
{
public:
    Program *program;
    Account(void);
    ~Account(void);
};

通过将Account类的实例传递给SetAccount函数,我是否正在制作它的副本,或者我将它作为参考传递?据我所知,我正在复制它,但我想确定。要将它作为参考传递,我需要使用指针,对吗?

我遇到的另一个问题是我的帐户类。让我们说它需要在某些时候有程序类引用。问题是Program和Account类彼此都有“#include”行,因此它会导致循环依赖。任何想法如何解决?

被修改

我的课程现在看起来像这样:

#include "Account.h"

class Program
{
public:
    Program();
    ~Program();
    void SetAccount(Account account);
};

class Program;

class Account
{
public:
    Program *program;
    Account();
    ~Account();
};

当我尝试在Account构造函数中初始化*程序时,我得到“不允许不完整的类型”和“'程序':没有合适的默认构造函数”。

4 个答案:

答案 0 :(得分:2)

Account课程中,您不需要Program的完整定义,因为您只是声明指针。因此,您可以使用前向声明,而不是包含Program.h

class Program;

class Account
{
public:
    Program *program;
    // ...

答案 1 :(得分:2)

在你的

定义中
void SetAccount(Account account);

必须在编译时知道类Account,因此必须在其之前包含该定义。

在您的帐户类中,您只使用指针,因此您可以进行转发声明

class Program;
class Account
{
public:
    Program *program;
   ...
};

这只是告诉编译器存在名为Program的对象的定义,但对象的大小不一定是已知的。只要只需要一个指针,就足够了。如果要取消引用这样的指针,则必须提供类定义。

答案 2 :(得分:1)

要传递引用,您实际上可以传递引用:

class Program
{
public:
    Program(void);
    ~Program(void);
    void SetAccount(const Account &account);
};

这是优先传递值,因为您不需要复制,因此更快,并且通过const还可以确保函数内部不会破坏您的对象或以任何方式修改它。

至于您的具体问题,您只需使用forward declaration并撰写

即可
class Program;

位于帐户的顶部,因为它不需要知道有关程序内部的任何信息,只需使用指向它的指针。

答案 3 :(得分:1)

要避免使用循环包含,请使用在预处理程序指令中包含头文件代码的通用策略:

Program.H:

#ifndef PROGRAM_H
#define PROGRAM_H 1

#include "Account.h"

class Program
{
    // ...
};

#endif