2013-12-23 78 views
1

我想进入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类的引用。问题在于Program和Account类都有“#include”行,所以会导致循环依赖。任何想法如何解决它?

编辑

我的班,现在看起来像这样:

#include "Account.h" 

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

class Program; 

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

当我尝试在帐户构造函数初始化*程序我得到“不完全类型是不允许”和“‘程序’:没有适当的默认构造函数可用“。

回答

2

在你的

void SetAccount(Account account); 

Account定义必须在编译时是已知的,所以你必须在它之前包括定义。

在您的账户类只使用一个指针,这样就可以使一个向前声明

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

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

+1

你是如何启动它的?如果你做'program = NULL;'这将工作。如果您尝试使用'new Program();'创建一个新对象,那么您当然必须知道它的大小,这意味着您必须提供包含文件。您只能使用前向声明来执行指针操作。 – Devolus

+0

我刚才问了同样的事情,在另一个答案。很想得到它的答案。 – martynaspikunas

+0

你得到了哪个错误,你现在的代码是怎么看的? – Devolus

2

在您的Account类中,您不需要完整定义Program,因为您只声明了一个指针。因此,您可以使用前向声明而不是包括Program.h

class Program; 

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

所以它帮助我摆脱了那个错误,但现在我有了一个新的。当我尝试在Account构造函数中初始化*程序时,我得到“不完整类型不允许”和“程序”:没有适当的默认构造函数可用。 – martynaspikunas

+0

@martynaspikunas删除'Program(void);'声明。除非你已经实现了'Program()'在cpp文件中执行一些初始化,否则你不需要它,因为编译器默认会正常工作。你也不需要'void'作为参数。这只是C。 – en4bz

1

传递一个参考就可以了,其实,过一个参考:

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

这是优选的按值传递,你并不需要进行复制,因此速度更快,通过const你也可以确保函数的内部不会破坏你的对象或以任何方式修改它。

至于你具体的问题,你可以使用forward declaration和写

class Program; 

在帐户的顶部,因为它并不需要了解程序的内部事情,只需使用一个指针它。

1

为了避免圆形包括,使用预处理指令内包围头文件代码的通用策略:

方案。H:

#ifndef PROGRAM_H 
#define PROGRAM_H 1 

#include "Account.h" 

class Program 
{ 
    // ... 
}; 

#endif