PDA

View Full Version : OOP



Future
پنج شنبه 26 شهریور 1388, 07:38 صبح
سلام دوستان. من تازه شروع به برنامه نویسی oop کردم و یه مشکل خیلی اساسی توی برنامه برا پیش اومده. کمن باید 2 تا کلاس تعریف کنم customer و یه کلاس دیگه بعنوان pensioner که از کلاس customer ارث ببره. مرحله بعد باید یه کلاس دیگه تعریف کنم به اسم manager که یه سری اطلاعات رو داخل یه فایل بریزه و از اون بتونه بخونه. مشکل اینجاست که من همه چیز رو تعریف کردم ولی نمی دونم چطوری اونا رو اجرا کنم. ممنون میشم اگه یه لطفی کنید و به این برنامه یه نگاه بیاندازید چون یکی از سوالات امتحانمه.

deopen
پنج شنبه 26 شهریور 1388, 13:41 عصر
دوست عزیز کدی که شما گذاشتید پر از اشکالات syntanx می باشد , مثلا سمی کالن فراموش شده , یا در کدی که شما گذاشتید :


#include <iostream>;

بعد از دستور پیش پردازنده نباید از سمی کالن استفاده کرد یا :


cout<<"Enter P(Pensioner), O(Ordinary): "; cin>>newtype; Type = newtype; endl;

endl بدون cout آمده و Type تعریف نشده و :


exit;

exit بدون آرگومان استفاده شده برای استفاده از exit باید هدر cstdlib ضمیمه بشه و بشکل زیر استفاده بشه :


exit(1);

بعد از این همه main نیز تعریف نشده .

Future
پنج شنبه 26 شهریور 1388, 16:12 عصر
سلام دوست عزیز. راستش من نیف می دونم کجا باید main رو تعریف کنم. ممنون میشم اگه بگید کجا main رو تعریف کرد.

deopen
پنج شنبه 26 شهریور 1388, 16:54 عصر
دوست عزیز من برنامه شما را از نظر گرامری یا syntanx یا نحوی چک کردم , فکر میکنم از نظر منطقی مشکلات زیادی داشته باشد , اگر عجله ای نیست به تحلیل و تفسیر کد بپردازیم , اما قبلش هدف از این برنامه و جزییات برنامه ای که باید می نوشتید را واضح تر بیان کنید , آیا فقط از نوشتن این برنامه قصد تمرین در مورد وراثت را داشتید.

Future
پنج شنبه 26 شهریور 1388, 20:23 عصر
سلام.
اولین هدفم اینه که بیشتر oop را یاد بگیرم و بتونم به این سوال امتحان جواب بدم. برنامه از این قراره که 2 تا کلاس باید تعریف بشن. بطوریکه کلاس دوم از ولی ارث ببره. سپس یه کلاس سومی باشه که بتونه اطلاعات را داخل یه فایل درج کنه و از اون بخونه. همی

deopen
جمعه 27 شهریور 1388, 20:38 عصر
برنامه از این قراره که 2 تا کلاس باید تعریف بشن. بطوریکه کلاس دوم از ولی ارث ببره. سپس یه کلاس سومی باشه که بتونه اطلاعات را داخل یه فایل درج کنه و از اون بخونه

برنامه ای که شما نوشتید :


//customer.h

#pragma once

class Customer
{
public:
Customer(void);//Constructor
~Customer(void);//Deconstrauctor;It must be as name as Class and cunstructor

};



//manager.h

#pragma once

class Manager
{
public:
Manager(void);
void Insert_Data(char Type[1], char F_name[15], char L_name[15], char Phone[10]);
int print();

~Manager(void);
};




//Pensioner.h
#pragma once

#include "customer.h"

class Pensioner : // this class inheirt from Customer class
public Customer
{
public:
Pensioner(void);
~Pensioner(void);
};


یعنی کلاس Pensioner کلاس مشتق شده Customer است؟!! خوب سوال من اینه , کلاس Pensioner چه چیزی از کلاس Customer را به ارث میبرد؟؟؟ Constructor و destructor را ؟؟؟ خیر!! این دو هرگز به ارث برده نمی شوند , هر کلاس سازنده و نابودکننده مخصوص به خود را دارد , در وراثت public تنها اعضای protected و public به ارث برده میشوند , البته اعضای private کلاس پایه یا base باز هم بعنوان اعضای مورثی شناخته میشوند ولی مستقیما قابل دسترسی نیستند , وراثت برای بسط کلاس است .

deopen
جمعه 27 شهریور 1388, 20:41 عصر
در مورد main هم بهتره یک main.cpp اضافه کنید و main را تعریف کنید , فعلا مشکلاتی که گفتم را اصلاح کنید تا بریم سراغ مشکلات بعدی .

Future
یک شنبه 29 شهریور 1388, 19:43 عصر
سلام دوست عزیز, من برنامه را کردم و مشکلاتی که گفتید را برطرف کردم. ولی الان یه مشکل دیگه هست
Error 1 error C2661: 'Manager::Manager' : no overloaded function takes 4 arguments c

deopen
یک شنبه 29 شهریور 1388, 20:54 عصر
Manager.cpp را پاک کنید و main را به شکل زیر تغییر دهید , فایلهای cpp اضافه هستند, سعی کنید از تقسیم کد به این شکل پرهیز داشته باشید تا مشکلاتی از این قبیل پیش نیاد :چشمک:


#include<iostream>

#include "Manager.h"

#include <iostream>
#include <fstream>
#include<string>
using std::string;


Manager::Manager()
{
}

void Manager::Insert_Data(string type, string first_name, string last_name, string phone)//Method Insert_data call from its class;in the cpp file of header we should define the action of its method.
{
this->type = type;
this->fname = first_name;
this->lname = last_name;
this->phone = phone;
};


Manager::~Manager(void)
{
}


int main()
{
Manager mng;
mng.Insert_Data("test","test1","test2","test3");A


system("Pause");
return 0;
}

Future
دوشنبه 30 شهریور 1388, 01:21 صبح
دوست عزیز خیلی خیلی ممنون. مرحله بعد ریختن این اطلاعات در یه فایل به نام telephone.dat می باشه. من کد را به برنامه اضافه کردم ولی هیچ فایلی ایجاد نمیشه که اطلاعات رو داخل اون بریزه. حتی وقتی دستی هم فایل رو ایجاد می کنم هیچ اطلاعاتی ریخته نمیشه.

deopen
دوشنبه 30 شهریور 1388, 11:29 صبح
برای آدرس دادن از 2 تا \ استفاده کن :


output.open("c:\\tel.dat",ios::app);

و برای write از char استفاده کن نه string .

موفق باشی...

Future
جمعه 03 مهر 1388, 07:40 صبح
سلام دوست عزیز, خیلی خیلی ممنون از راهنماییتون.
این سوال برنامه است :
Author two classes, Customer an Pensioner. Pensioner should be subclass of Customer. In the third class,Manager, it should read a file called telephone.dat and dow the following functions

Telephone.dat include
O Jimbo Jones 43215678 56
O Glady Skinny 767345 34 P P234345



If the first character is “O” then there is two possibilities.
• The customer is an ordinary customer. In this case the fields are firstName, LastName, telephoneNo and numberOfCalls. A customer object should be created an initialize with the values from this line.
• The customer is a pensioner. In this case, we have a field P which purely signifies that we are dealing with a pensioner, followed by the pension number. A Pensioner object should be created with the four customer fields and also the pension number.


من برنامه را با کمک راهمایی قبلب تون یه مقداریشو انجام دادم ولی متوجه این خط نمیشم که باید چکار کرد
A Pensioner object should be created with the four customer fields and also the pension number

ممنون میشم اگه برنامه من را بکه نگاه بیاندازید و بگید جکار باید کرد.
خیلی خیلی ممنون

deopen
جمعه 03 مهر 1388, 21:17 عصر
برنامه را آشفته نوشتید , گفته بودم سعی کنید از string استفاده نکنید , main را از اشکالات نحوی پاکسازی کردم , اما هنوز دارای اشکالات منطقی زیادی می باشد , شما باید یک سازنده برای مقدار دهی اولیه تعریف کنید نه یک سازنده خالی!!


#include "Manager.h"
#include "Pensioner.h"
#include <iostream>
#include <fstream>
#include<string>
#include<fstream>
using namespace std;
using std::string;
#include<cstdlib>


Manager::Manager()
{
}
void Manager::Insert_Data(string type, string first_name, string last_name, string phone)//Method Insert_data call from its class;in the cpp file of header we should define the action of its method.
{
//variables of class need to validate
this->type = type;
this->fname = first_name;
this->lname = last_name;
this->phone = phone;

ifstream input;//read data from file
ofstream output;//write data into file


if (input.fail())
{
cout<<"File doesn't exist"<<endl;
exit(1);
} else
{
output.open("c:\\telephone.dat",ios::app);
output<<type<<"\t"<<fname<<"\t"<<lname<<"\t"<<phone<<endl;
}
output.close();
}



string Manager::readfile(char type)
{
Manager *mngr;
Pensioner *pn;

try
{
while (!input.eof())
{
input >> type >> fname >> lname >> tel >> n_cal ;
if ((input >> type == "O") || (input >> type == "o"))
{
mngr = new Manager();
}
else if ((input >> type == "P") || (input >> type == "p"))
{
pn = new Pensioner();

}



}
}
catch (int e)
{
cerr<< "An exception occurred. Exception Nr. " << e << endl;
cerr<<"File doesn't exit ...!"<<endl;
}
return 0;
}




Manager::~Manager(void)
{
}

int main()
{
}

ali zi zeperto
شنبه 04 مهر 1388, 23:15 عصر
من می خوام یه برنامه بنویسم که قسمتیش باید یه عدد رو از ورودی بگیره و به تعدادش شی ایجاد کنه.یعنی اگر ۵ زدیم ۵ تا شی ار یه کلاس مشخصی شاخته بشه.
چطوری می تونم اینکار رو بکنم؟

deopen
یک شنبه 05 مهر 1388, 11:28 صبح
من می خوام یه برنامه بنویسم که قسمتیش باید یه عدد رو از ورودی بگیره و به تعدادش شی ایجاد کنه.یعنی اگر ۵ زدیم ۵ تا شی ار یه کلاس مشخصی شاخته بشه.
چطوری می تونم اینکار رو بکنم؟

شما باید آرایه ای از شی مورد نظر با استفاده از new ایجاد کنید :


#include<iostream>
using std::cout;
using std::cin;

#include<windows.h>

class test {
public:
test(int);
void print();
int number;
};

test::test(int num=1) : number(num){
cout<<"Cunstracter \n";
}

void test::print() {
cout<<"number is "<<number<<"\n";
}

int main()
{
int i=0;
test *ptr;

cout<<"enter : "; cin>>i; cout<<"\n";
ptr=new test[i];

for (int j=0;j<i;j++){
ptr[j].number=j;
ptr[j].print();
}


system("pause");
return 0;
}

لازم به ذکر است که کلاس مورد نظر حتما باید سازنده پیشفرض داشته باشد, در مثالی که زدم ابتدا آرایه ای از اشیا بصورت اشاره گر ساخته میشود یعنی هر اشاره گر از آرایه به یک شی اشاره میکند.