Nested definition problem for C + + classes--two classes refer to each other

Source: Internet
Author: User

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);
}

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.