برگزیده های پرشین تولز

دفترچه تلفن با استفاده از کلاس ميخوام ( c++ )

adameh_bahal

Registered User
تاریخ عضویت
13 سپتامبر 2005
نوشته‌ها
386
لایک‌ها
25
محل سکونت
Tehran
يه دفترچه تلفن با استفاده از کلاس ميخوام که تابع search به صورت تابع دوست کلاس تعريف بشه . تابع های input(ورودی),add(اضافه کردن),delete(پاک کردن),print(چاپ کردن) رو هم داشته باشه
فقط ميخوام برنامه ساده باشه
ممنون
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
تحت چه تکنولوژي باشه ؟
چه متدولوژي ؟
با MFC انجام بشه ؟ 3D ?
Intelligence باشه ؟
براتون شماره هم بگيره ؟
اوه راستي توي OS Guest هم کار کنه ؟
 

aftab110

کاربر تازه وارد
تاریخ عضویت
25 ژوئن 2006
نوشته‌ها
37
لایک‌ها
0
با سلام به آقا مهدی گل و آرش عزیز.
من هم در این مورد سئوال داشتم.
در این گونه برنامه ها نقش کلاس چیه؟
آیا باید هر ثبت یک شی باشد یا این که نه و فقط کارهایی که برنامه انجام می دهد بشود متدهای کلاس. یعنی فقط اول برنامه فقط یک شی واحد بسازیم برای دسترسی به متدهای کلاس.

در حالتی که هر ثبت یک شی بشود من مشکل دارم در ایجاد شی در حالت ران تایم. به خاطر همین راهی که به ذهنم می رسد این است که شاید بشود به شکل آرایه اول برنامه مثلا 100 تا شی بسازیم و بعد در آنها ثبت کنیم. یعنی پراپرتی های آنها را تغییر دهیم.
البته نیاز به این برنامه ندارم. فقط خواستم بدانم شی هایی که در این گونه برنامه ها ساخته می شوند مربوط به کدام قسمت برنامه است. آخه کلمه شی مرا ترغیب می کند که هر ثبت یک شی باشد و از سویی انجامش به دلیل همان روش ایجاد شی در حالت ران تایم سخته برام.
گفتم شاید موردهای مشابه را شما قبلا دیده باشید و چند خط توضیح بدهید تا در نوشتن این گونه برنامه ها من توجیه بشوم.
ممنون از شما.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
وقت قراراه ابجکت اروینتتد برنامه بنویسید خودتون هم یه شی هستید چه برسه به برنامه
شما باید یه کلاس برای هر تلفن بسازید که چند عضو داده ای داشته باشه مثل نام و نام خانوادگی تلفن و...
یه کلاس ها برای مدیریت اینها برای راختی می تونید این اعضا رو درون یه vector یا list که در کتابخانه stl موجود هست ذخیره کنید تا به جای سختش یعنی مدیریت حافظه کاری نداشته باشید
در ضمن من نفهمیدم منظورتون از ایجاد شی در زمان ران تایم چی هست اگه اینکه یه شی رو به صورت پویا ایجاد کنیم خیلی کار سختی نیست

کد:
class test
{
	int x;
	public:
		test(int n){x=a;}
};

int main
{
	test * ob=new test;
	.....
	
	delete ob;
}
 

aftab110

کاربر تازه وارد
تاریخ عضویت
25 ژوئن 2006
نوشته‌ها
37
لایک‌ها
0
سلام
قسمت اول را متوجه شدم.
قسمت دوم هم درست می فرمایید ساختن شی در زمان ران تایم راحت است . فقط اگر بخواهیم 100 تا شی بسازیم میشه به جای نام
ob از چی باید استفاده کنیم. حالت آرایه ای می خواهم بشه. چنین کاری ممکنه؟ یعنی می خواهم هر ثبتی که داشتم یک اسم آماده داشته باشم تا با آن اسم شی اش را بسازم.
برنامه شما درسته ولی فرض کنید یک بار برنامه شما بخواد اجرا بشه 5 تا شی بخواد ایجاد کنه و یک بار اجرا بشه و 10 تا شی ایجاد کنه. این برنامه چطور باید ایجاد بشه؟ یعنی کارخانه ایجاد شی ما اسم های جدید را از کجا می آورد؟ می دونم یک جای کارم مشکل داره ولی نمی دوم کجا. یک چیز ساده را انگار حواسم نیست. شاید با آرایه به راحتی بشه یا با اشاره گر یا حتی بدون اونها.
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
در رابطه با سوال 1 :
حالت استاتيک
کد:
test arr[20] ;
و استفاده از آرايه مثل :
با سازنده - ميتونه نباشه ، مستقيم تعريف شده-
کد:
    arr[0] = test(22) ;
و دايناميک : (فکر کنم سوال دومتون هم همچين چيزي رو مي خواد !!)
يه همچين چيزي :
کد:
    int cnt=0;
    cin >> cnt ;
    test *arr = new test[cnt] ;
    arr[0].n = 20 ;
    cout << ++arr[0].n ;
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
قفط دقت کنید که در حالت آرایه ای باید کلاس یه CONSTRUCTOR پیش فرض داشته باشه(سازنده ای که هیچ پارامتری احتیاج نداشته باشه)
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
>> قفط دقت کنید که در حالت آرایه ای باید کلاس یه CONSTRUCTOR پیش فرض داشته باشه(سازنده ای که هیچ پارامتری احتیاج نداشته باشه)

دقيقا ، نکته جالبي بود ، تشکر

و يک سوال ، آرش جان نميشه همون اول يک بردار 10 تايي تعريف کنيم ؟

شبهه کدي مثل :
کد:
vector<test> arr[?] ;
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
يه چيز جالب
با فرض اينکه همچين چيزي بگذاريم در سازنده
کد:
cout << "ctor ";
وقتي از دو حالت بردار و آرايه استفاده مي کنيم
دو فرق اساسي هست : آرايه(10 تايي) 10 بار ctor رو مي نويسه اما بردار نه !!
دليلش چي ميتونه باشه ؟
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نکته جالبی اشاره کردید تا حالا به این دقت نکرده بودم

کد:
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;
class test
{
	
public:
	int i ;
	test()
	{
		cout<<"create"<<endl;
	}
	test(const test& f)
	{
		i=f.i;
		cout<<"copy"<<endl;
	}
};

int main()
{
  vector<test> v(10);	
  system("pause");
  return 0;
}

برای وکتور n تای یک بار شی رو می سازه و n-1 بار کپی اش می کنه چون هم مثل هم هستن اینکار رو برای افزایش کارایی انجام میده فقط دقت داشته باشید که اگه کلاس Copy constructor نداشته باشه در بعضی اوقات ممکنه فاجعه به بار بیاد مثلا اینو ببینید


کد:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;
class test
{
	char *p;
public:

	test()
	{
		p=new char[20];	
	}
	~test()
	{
		delete [] p;
	}

	void setString(char *str)
	{
		strcpy(p,str);
	}

	void show(void)
	{
		cout<<p<<endl;
	}
};

int main()
{
  vector<test> v(10);	
  v[0].setString("myString");
  cout<<"v[0] before change v[1] is : ";
  v[0].show();
  v[1].setString("other string");
  cout<<"v[0] after  change v[1] is : ";	
  v[0].show();	
  cout<<"v[0] is change when v[1] is changed"<<endl;
  system("pause");
  return 0;
}

درستش اینکه یه کپی construcot بزرایم تا محتویات اون اشاره گر رو کپی کنه به یه جای دیگه و اشاره ابجکت رو تنظیم کنه به اونجا

کد:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;
class test
{
	char *p;
public:

	test()
	{
		p=new char[20];	
	}
	test(const test& ob)
	{
		p=new char[20];
		strcpy(p,ob.p);
	}

	~test()
	{
		delete [] p;
	}

	void setString(char *str)
	{
		strcpy(p,str);
	}

	void show(void)
	{
		cout<<p<<endl;
	}
};

int main()
{
  vector<test> v(10);	
  v[0].setString("myString");
  cout<<"v[0] before change v[1] is : ";
  v[0].show();
  v[1].setString("other string");
  cout<<"v[0] after  change v[1] is : ";	
  v[0].show();	
  cout<<"v[0] is change when v[1] is changed"<<endl;
  system("pause");
  return 0;
}


ممنون از توجهتون
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
خیلی جالب بود
p در مثال دوم مثل static var بود

بنده هم از تحلیل و حل مساله شما متشکرم :)
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
استاتیک نیست فقط همه اشاره گرها به یک جا اشاره می کنن اگه شما یکی از اون p رو تغییر بدید(تاکید می کنم خود p نه محتوایت محلی که اشاره می کنه) توی بقیه تاثیری نداری
 
بالا