2013-12-23 80 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