我正在尝试进入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构造函数中初始化*程序时,我得到“不允许不完整的类型”和“'程序':没有合适的默认构造函数”。
答案 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