الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Can Shared Pointers In Stl? Without External Libraries?

بدأه Moudey في 6 مارس 2009 · 1 رد · 435 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــة ،،

هل يمكن مشاركة المؤشرات فى الـ STL بدون مكتبات خارجية ؟

ويمكن تطبيقها على هذا المثال

#include <stdio.h>
#include <iostream>
#include <vector>
#include <atlstr.h>

using namespace std;

typedef class SelObjs
{
public :
	vector<CString*> Items;
	typedef vector<SelObjs*>::iterator  iterator;
	typedef vector<CString*>::size_type size_type;

public :
	SelObjs() { }
	SelObjs(size_type capacity) 
	{
		this->Reserve(capacity);
	}

	// Destroys the SelObjs object.
	~SelObjs()
	{
		printf("start delete ~SelObjs(%d)\r\n{\r\n", this);
		// Frees all allocated resources.
		vector<CString*>::iterator iter;
		iter = this->Items.begin();
		while(iter != this->Items.end()) 
		{
			if(*iter) 
			{
				printf("\tdelete item(%s)\r\n", *(*iter));
				delete (*iter); 
			}
			*iter = 0;
			iter = this->Items.erase(iter);
		}
		printf("}\r\n");
	}

	// Dynamically allocate the correct amount of memory.
	void Reserve(size_type count)
	{
		this->Items.reserve(count);
	}

} *LPSelObjs;

class User
{
public :
	typedef vector<User*>::iterator
					iterator;
	CString			*Name;
	SelObjs			*SelObjs;
	vector<User*>	Users;

	User() 
	{
		this->Name 	  = 0;
		this->SelObjs = 0;
	}

	// Destroys the User object.
	~User() 
	{
		if(0 != Name) {
			printf("~User(%s)\r\n", *this->Name);
			delete this->Name;
		} else 
			printf("~User()\r\n");
			this->Name = 0;
		Free(this->Users);
		if(0 != this->SelObjs)
			delete this->SelObjs;
		this->SelObjs = 0;

	}
	// Frees all allocated resources.
	static void Free(vector<User*>&	users)
	{
		iterator iter = users.begin();
		while(iter != users.end()) 
		{
			if(*iter) 
				delete (*iter); 
			*iter = 0;
			iter = users.erase(iter);
		}
	}
};


SelObjs *m_selObjs = 0;

int main(int argc, char* argsv[])
{
	m_selObjs = new SelObjs(10);
	CString *item = 0;

	for(int i = 0; i < 10; i++)
	{
		item = new CString;
		item->Format("'%d'", i);
		m_selObjs->Items.push_back(item);
		item = 0;
	}

	User *admin = new User();
	admin->Name = new CString("admin");
	admin->SelObjs = m_selObjs;

	User *guest = new User();
	guest->Name = new CString("guest");
	guest->SelObjs = m_selObjs;

	vector<User*> userList(2);
	userList.push_back(admin);
	userList.push_back(guest);

	if(guest) delete guest; guest = 0;

	// error because the guest was deleted or null, but guest is shared pointer.
	User::Free(userList);

	if(m_selObjs) delete m_selObjs; m_selObjs = 0;

	cout << "Press any key to exit." << endl;
	getchar(); return 0;
}

حيث ان الصنف User يحتوى على مؤشرات مشتركه

المشكلة تكمن عند تحرير اى عنصر مسبقاً .

مواضيع متنوعة

#2

حاولت حل المشكلة لكن لااعلم ان كانت صحية ولكنها تقوم بما اريد

#include <stdio.h>
#include <iostream>
#include <vector>
#include <atlstr.h>

using namespace std;

typedef class SelObjs
{
public :
	vector<CString*> Items;
	typedef vector<SelObjs*>::iterator	 iterator;
	typedef vector<CString*>::size_type size_type;

public :
	SelObjs()
	{
	}
	SelObjs(size_type capacity) 
	{
		this->Reserve(capacity);
	}

	// Destroys the SelObjs object.
	~SelObjs()
	{
		this->Free(true);
	}

	// Dynamically allocate the correct amount of memory.
	void Reserve(size_type count)
	{
		this->Items.reserve(count);
	}

	void Free(bool deleteRef = false)
	{
		if(this->Items.empty()) return;
		vector<CString*>::iterator iter;
		iter = this->Items.begin();
		while(iter != this->Items.end()) 
		{
			if(*iter) 
			{
				if(deleteRef) delete (*iter); 
				*iter = NULL;
			}
			iter  = this->Items.erase(iter);
		}
	}

	static void Free(SelObjs *selObjs, bool deleteRef = false)
	{
		if(selObjs) 
		{
			if(deleteRef)
				delete selObjs;
			else
				selObjs->Free(false);
			selObjs = NULL;
		}
	}

} *LPSelObjs;


class User
{
public :
	typedef vector<User*>::iterator
					iterator;
	CString			*Name;
	SelObjs			*SelObjs;
	vector<User*>	Users;

	User() 
	{
		this->Name 	  = NULL;
		this->SelObjs = NULL;
	}

	// Destroys the User object.
	~User() 
	{
		this->Free(true);
	}

	// Frees all allocated resources.
	void Free(bool deleteRef = false)
	{
		if(NULL != this->Name && deleteRef)
		{
			delete this->Name;
		}
		this->Name = NULL;

		if(NULL != this->SelObjs)
		{
			//if(deleteRef)
			//	delete this->SelObjs;
			//else
				this->SelObjs->Free(deleteRef);
			this->SelObjs = NULL;
		}

		Free(this->Users, deleteRef);
	}

	// Frees all allocated resources.
	static void Free(vector<User*>&	users, bool deleteRef = false)
	{
		if(users.empty()) return;
		iterator iter = users.begin();
		while(iter != users.end()) 
		{
			if(*iter) 
			{
				//if(deleteRef)
				//	delete *iter;
				//else
					(*iter)->Free(deleteRef);
				*iter = NULL;
			} 
			iter  = users.erase(iter);
		}
	}
};

SelObjs *m_selObjs = 0;

int main(int argc, char* argsv[])
{
	m_selObjs = new SelObjs(10);
	CString *item = 0;

	for(int i = 0; i < 10; i++)
	{
		item = new CString;
		item->Format("'%d'", i);
		m_selObjs->Items.push_back(item);
		item = 0;
	}

	User *admin = new User();

	admin->Name	 = new CString("admin");
	admin->SelObjs = m_selObjs;

	User *guest = new User();
	guest->Name = new CString("guest");
	guest->SelObjs = m_selObjs;
	vector<User*> userList(2);
	userList.push_back(admin);
	userList.push_back(guest);
	if(guest) guest->Free(true); //guest = 0;

	// error because the guest was deleted or null, but guest is shared pointer.
	User::Free(userList, true);
	if(m_selObjs) delete m_selObjs; m_selObjs = 0;

	cout << "Press any key to exit." << endl;
	getchar(); return 0;
}

مواضيع متنوعة

مواضيع مشابهة