A.h file
Class A
{
Public:void MethodA ();
...
};
B.h file
Class B
{
Public:void MethodB ();
...
}
It is now in Class A to invoke the method in Class B, and in Class B there is a method to invoke in Class A.
Failed methods tested:
Method 1:
A.h file
#include "B.h"
Class B;
Class A
{
Private:b M_CLASSB;
Public:void MethodA ();
...
};
B.h file:
#include "A.h"
Class B
{
Private:a M_classa;
Public:void MethodB ();
...
};
Leads to a dead loop.
Probable cause: When constructing A, B should be constructed first, and B must be constructed first to cause a dead loop;
Method 2:
A.h file
#include "B.h"
Class B;
Class A
{
Private:b *M_PCLASSB;
Public:void MethodA ();
...
};
B.h file:
#include "A.h"
Class B
{
Private:a *m_pclassa;
Public:void MethodB ();
...
};
Then add the Class A constructor in A.cpp, respectively: M_PCLASSB = new class B;
In the Class B constructor in B.cpp, add: M_pclassa = new class A;
Possible reasons: Same Method 1.
Method 3:
A.h file
#include "B.h"
Class B;
Class A
{
Friend class B;
Private:b *M_PCLASSB;
Public:void MethodA ();
...
};
B.h file:
#include "A.h"
Class B
{
Private:a *m_pclassa;
Public:void MethodB ();
...
};
Then add the Class A constructor in A.cpp, respectively: M_PCLASSB = new class B;
In the Class B constructor in B.cpp, add: M_pclassa = new class A;
The results and causes are the same.
The right approach:
A.h file
#include "B.h"
Class B;
Class A
{
Friend class B;
Private:b *M_PCLASSB;
Public:void MethodA ();
...
};
B.h file:
#include "A.h"
class B
{
public:a *m_pclassa;
public:void MethodB ();
...
}; The
is then added to the Class A constructor in A.cpp: M_PCLASSB = new Class B;m_pclassb->m_pclassa = this;
Add in Class B constructors in B.cpp: M_pclassa = new class A;
Message.h:interface for the "message class."
//////////////////////////////////////////////////////////////////////
#if!defined (AFX_MESSAGE_H__ Da2e5287_a04c_445c_82f5_c685f492613a__included_)
#define Afx_message_h__da2e5287_a04c_445c_82f5_ C685f492613a__included_
#if _msc_ver > 1000
#pragma once
#endif//_msc_ver > 1000
#include " Folder.h "
class folder;
Class message
{public
:
void Remove (Folder &folder);
void Save (Folder &folder);
Message (const-message &mess);
message& operator = (const message &mess);
Message (const string &STR = ""): Content (str) {};
Virtual ~message ();
Private:
string content;
Set<folder *> folders;
void Put_msg_in_folders (const set<folder *> &folds);
void Rem_msg_in_folders ();
#endif//!defined (AFX_MESSAGE_H__DA2E5287_A04C_445C_82F5_C685F492613A__INCLUDED_)
Message.cpp:implementation of the message class. #include "stdafx.h" #include "Message.h"/ Construction/destruction///////////////
Message::~message () {rem_msg_in_folders ();} Message::message (const message &mess): Content (mess.content), folders (mess.folders) {put_msg_in_folders (folders
);
} message& message::operator = (Const message &mess) {if (this!= &mess) {rem_msg_in_folders ();
Content = Mess.content;
folders = Mess.folders;
Put_msg_in_folders (Folders);
return *this;
} void Message::save (Folder &folder) {Folders.insert (&folder);
Folder.addmsg (this);
} void Message::remove (Folder &folder) {folders.erase (&folder);
Folder.remmsg (this); } void Message::P ut_msg_in_folders (const set<folder *> &folds) {for (Set<folder *>::const_iterator it = Folds.begin (); it!= folds.end (); ++it)
{(*it)->addmsg (this); } void Message::rem_msg_in_folders () {for (Set<folder *>::const_iterator it = Folders.begin (); it!= Folders.en D ();
++it) {(*it)->remmsg (this);
}
}
Folder.h:interface for the Folder class.
//////////////////////////////////////////////////////////////////////
#if!defined (AFX_FOLDER_H__ A34ce0d3_ddd3_4c9f_b97c_c872ac65ecea__included_)
#define Afx_folder_h__a34ce0d3_ddd3_4c9f_b97c_c872ac65ecea __included_
#if _msc_ver > 1000
#pragma once
#endif//_msc_ver > 1000
//#include "Message.h"
class message;
Class Folder
{
friend class message;
Public:
Folder ();
Virtual ~folder ();
Private:
void remmsg (message *m);
void addmsg (Message *m);
Set<message *> messages;
#endif//!defined (AFX_FOLDER_H__A34CE0D3_DDD3_4C9F_B97C_C872AC65ECEA__INCLUDED_)
Folder.cpp:implementation of the Folder class.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
# Include "Folder.h"
//////////////////////////////////////////////////////////////////////
// Construction/destruction
//////////////////////////////////////////////////////////////////////
Folder :: Folder ()
{
}
Folder::~folder ()
{
}
void folder::addmsg (message *m)
{
Messages.insert (m);
}
void folder::remmsg (Message *m)
{
messages.erase (m);
}