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

ماهى طريقة كتابة كلاس فى c ليسى فى c++

بدأه محمدهلال في 20 نوفمبر 2011 · 10 رد · 1,837 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ماهى طريقة كتابة كلاس فى c ليسى فى c++

عاوذ اعرف الطريقة كتابة كلاس بالمتغيرات والدوال

الاسم:محمدهلال

البلد:مصر

مبتدى بي اتش بي

#2

أجابة سؤال تدفعك لدراسة c++ أقصد لهذا السبب تم اختراع الفئات التى تمكن من دمج المتغيرات والدوال والبيانات مع بعضها البعض تظهر لك فى صورة كائن. وهذة الميزة متاحة فى اللغات كائنيية التوجية منها الس بلس بلس.

اما اذا كنت مصرا على التعمق فى السى كمبرمج نظم مخضرم فالتأكيد اجابة سؤال هى هياكل البيانات struct تحتوى على متغيرات عامة او خاصة فقط. اما الدوال فهى أما ان تكون متاحة للجميع اى عامة او تكون خاصة جدا...

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

سؤالك غير ممكن من الناحية العلمية والسبب ان لغة السي لا تدعم البرمجة كائنية التوجه OOP وانما هي لغة برمجة مهيكلة Structural Language ولذلك لا يمكن تصميم Class بها .. هذا الشئ اساسي ويجب معرفته ..

اما اذا اردت تصميم ذلك بلغة سي يمكنك تصميم Struct خاص بك واعطه قيم المتغيرات والثوابت والمؤشرات وماتريد وبعدها عرف من خلاله دوال .. لكن كمفهوم الكائن والصنف فهذا بعيد كل البعد .. فهو مجرد هيكل وله خصائصه .. اما بالنسبة للوراثة وتحميل العمليات الزائد وما الى ذلك من خصائص فهي غير ممكنة ..

ولكن ماذا تقصد بكتابة كتابة كلاس بالمتغيرات والدوال .؟

ماهو الفرق بين اللغتين من هذه الناحية ؟ حتى مع برمجة كلاس جديد .. ؟ انت ايضا تتعامل مع متغيرات ودوال ولكن طريقة كتابتها ومكانها مختلف عن العادة .. ستقوم بتقسيم الصنف الى جزئين او ثلاثة اجزاء ولكن الغالب بالمستوى الاعتيادي جزئين Private و Public .. الاول لتضع به متغيرات او خصائص الصنف التي تميز بها كل كائن عن كائن اخر .. اما الجزء العام وهو الثاني فهو لوضع وتعريف عمليات هذا الكائن .. هل هو يقرأ يكتب يتحرك يمشي ......

خصائص = Variables ...

عمليات = Functions ...

1

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#4

بطريقة مباشره ..... لا يمكنك ...

لكن مبرمجى السي يتحايلون على ذلك عن طريق إستخدامهم لل Struct (و هو بالطبع لا يقابل ال class في السي++).....

شاهد هذا المثال:

الملف الأول:

// Employee.h

#ifndef _EMPLOYEE_H_
#define _EMPLOYEE_H_

typedef struct
{
	char name[50];
	unsigned long id;
}Employee;

Employee* alloc(size_t);
Employee* init(Employee*);
Employee* initWithNameAndId(Employee*, char*, unsigned long);
void print(Employee*);
void delete(Employee*);

#endif

الملف الثانى:

// Employee.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Employee.h"

Employee* alloc(size_t mem_size)
{
	return (Employee*) malloc(mem_size);
}
Employee* init(Employee* emp)
{
	if (emp)
	{
		strcpy(emp->name, "");
		emp->id = 0;
	}
	return emp;
}
Employee* initWithNameAndId(Employee* emp, char* _name, unsigned long _id)
{
	if (emp)
	{
		strcpy(emp->name, _name);
		emp->id = _id;
	}
	return emp;
}
void print(Employee* emp)
{
	if (emp)
	{
		printf("%s %i\n", emp->name, emp->id);
	}
}
void delete(Employee* emp)
{
	if (emp) free(emp);
}

الملف الثالث:

// main.c
#include <stdio.h>
#include "Employee.h"

int main(void)
{
	Employee e1;
	initWithNameAndId(&e1, "ali", 20);
	print(&e1);

	Employee e2;
	init(&e2);
	print(&e2);

	Employee* e3 = initWithNameAndId(alloc(sizeof(Employee)), "Muhammad", 23);		// Objective-c style initalization
	print(e3);
	delete(e3);

	return 0;
}

المخرجات:

ali 20
 0
Muhammad 23
2
#5

جزاكم الله الف خير اخوانى الكرام

__Unknown كتب:

بطريقة مباشره ..... لا يمكنك ...

لكن مبرمجى السي يتحايلون على ذلك عن طريق إستخدامهم لل Struct (و هو بالطبع لا يقابل ال class في السي++).....

شاهد هذا المثال:

الملف الأول:

// Employee.h

#ifndef _EMPLOYEE_H_
#define _EMPLOYEE_H_

typedef struct
{
	char name[50];
	unsigned long id;
}Employee;

Employee* alloc(size_t);
Employee* init(Employee*);
Employee* initWithNameAndId(Employee*, char*, unsigned long);
void print(Employee*);
void delete(Employee*);

#endif

الملف الثانى:

// Employee.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Employee.h"

Employee* alloc(size_t mem_size)
{
	return (Employee*) malloc(mem_size);
}
Employee* init(Employee* emp)
{
	if (emp)
	{
		strcpy(emp->name, "");
		emp->id = 0;
	}
	return emp;
}
Employee* initWithNameAndId(Employee* emp, char* _name, unsigned long _id)
{
	if (emp)
	{
		strcpy(emp->name, _name);
		emp->id = _id;
	}
	return emp;
}
void print(Employee* emp)
{
	if (emp)
	{
		printf("%s %i\n", emp->name, emp->id);
	}
}
void delete(Employee* emp)
{
	if (emp) free(emp);
}

الملف الثالث:

// main.c
#include <stdio.h>
#include "Employee.h"

int main(void)
{
	Employee e1;
	initWithNameAndId(&e1, "ali", 20);
	print(&e1);

	Employee e2;
	init(&e2);
	print(&e2);

	Employee* e3 = initWithNameAndId(alloc(sizeof(Employee)), "Muhammad", 23);		// Objective-c style initalization
	print(e3);
	delete(e3);

	return 0;
}

المخرجات:

ali 20
 0
Muhammad 23

جزاك الله الف خير اخى الكريم

من المثال انى اقوم بعمل ال struct عادى وبعدين اقوم بعمل ليه دوال يتم تمرير ليها ال struct والقيم الى هعطية ليه كده

فهمة جزاك الله الف خير اخر الكريم

الاسم:محمدهلال

البلد:مصر

مبتدى بي اتش بي

#6
محمدهلال كتب:

بسم الله الرحمن الرحيم

ماهى طريقة كتابة كلاس فى c ليسى فى c++

عاوذ اعرف الطريقة كتابة كلاس بالمتغيرات والدوال

بسم الله الرحمن الرحيم

ان كنت تسال عن كلاسات في سي++ فهو كما وضح اخوة فهي موجودة في سي++ القياسية .

اما في السي يمكن برمجة ب الكلاسات لكن ليس بالسي القياسية وانما بGtk+ التي اضافة لسي طبقة ال GObject

والسلام

#7

إنظر لهذا الحيلة :

/*
* FILE: class.h
*/

#include<string.h>
#include<stdlib.h>

typedef void say_t(char *);

typedef struct {
    say_t* say;
    char* name;
} __class;

void say( char *string ){
    printf("%s\n", string);
}

__class* new(char* name){
    __class* class  = (__class*) malloc(sizeof(__class));

    class->name = (char*) malloc(sizeof(char) * strlen(name));
    class->name = name;  

    class->say    = say;

    return(class);
}

#include<stdio.h>
#include"class.h"

int main(void){
    __class* class  = new("Barakat");

    class->say("Hello world!");
    printf("My name is %s\n", class->name);

    free(class);
    return(0);
}

$ ./main Hello world!
My name is Barakat
$

تم تعديل هذه المشاركة بواسطة Mr.B في 2 فبراير 2012 في 15:10

#8

جميل إستخدام "مؤشر على الداله" لتمثيل دوال النوع ...

ملحوظه... الكود به العديد من أخطاء إدارة الذاكره ..

مثل

class->name = (char*) malloc(sizeof(char) * strlen(name));
class->name = name;
#9
__Unknown كتب:

جميل إستخدام "مؤشر على الداله" لتمثيل دوال النوع ...

ملحوظه... الكود به العديد من أخطاء إدارة الذاكره ..

مثل

class->name = (char*) malloc(sizeof(char) * strlen(name));
class->name = name;

أشكرك أخي على التعقيب, ممكن توضع أين الخطأ لأنني فعلاً لم أستطع إكتشافه. مثلاً هنا :

class->name = (char*) malloc(sizeof(char) * strlen(name));
class->name = name;

قلت أنني سأنشئ مساحة حجمها يساوي تماماً حجم name (حجم الـchar مضروب في طول name), وبعد أن جهزتها نقلت name لها

تم تعديل هذه المشاركة بواسطة Mr.B في 3 فبراير 2012 في 05:35

#10

لي إستفسار قبل أن أتكلم عن الأخطاء..

هل يمكن لي أن أصل لمؤشر ال struct من داخل هذه الداله؟ (بدلا من إرساله كأول معامل للداله)

بالنسبه للأخطاء, حسنا ... فلنبدأ بهذه الداله:

__class* new(char* name){
	__class* class  = (__class*) malloc(sizeof(__class));

	class->name = (char*) malloc(sizeof(char) * strlen(name));
	class->name = name;  

	class->say	= say;

	return(class);
}

بالنسبه لهذا التعبير:

(char*) malloc(sizeof(char) * strlen(name));

أنت قمت بحجز زاكره و من ثم قمت بإسنادها للمؤشر class->name كما في السطر

class->name = (char*) malloc(sizeof(char) * strlen(name));

ثم أنه عندما كتب هذا السطر:

class->name = name;

قمت بتجاهل هذه الذاكره (لم تستخدمها ... و لم تحررها - free ) و بالتالى أصبح لدينا مشكلتان ...

الأولى أن الذاكره التى تم حجزها في السطر السابق لم يعد هناك أي مؤشر يشير عليها ..

أما الثانيه .. قمت بجعل class->name يشير إلى ال char* المرسل من الداله (بدل من أن تقوم بنسخه بإستخدام strcpy مثلا)

نأتى للداله الأخري

int main(void){
	__class* class  = new("Barakat");

	class->say("Hello world!");
	printf("My name is %s\n", class->name);

	free(class);
	return(0);
}

السطر

free(class);

بإعتبار أنك راعيت ما ذكرتُه سابقا, فإنك هنا أيضا وقعت في خطأ ... فقمت بتحرير الذاكره المحجوزه لل struct __class و لم تحرر ذاكرة العضو name ( و التى قمت بحجزها)

بمعنى أخر .... هناك عدد 2 malloc و فقط عدد 1 free ... يجب أن يكون عددهما متساويان

تم تعديل هذه المشاركة بواسطة __Unknown في 3 فبراير 2012 في 11:14

1
#11
__Unknown كتب:

لي إستفسار قبل أن أتكلم عن الأخطاء..

هل يمكن لي أن أصل لمؤشر ال struct من داخل هذه الداله؟ (بدلا من إرساله كأول معامل للداله)

بالنسبه للأخطاء, حسنا ... فلنبدأ بهذه الداله:

__class* new(char* name){
	__class* class  = (__class*) malloc(sizeof(__class));

	class->name = (char*) malloc(sizeof(char) * strlen(name));
	class->name = name;  

	class->say	= say;

	return(class);
}

بالنسبه لهذا التعبير:

(char*) malloc(sizeof(char) * strlen(name));

أنت قمت بحجز زاكره و من ثم قمت بإسنادها للمؤشر class->name كما في السطر

class->name = (char*) malloc(sizeof(char) * strlen(name));

ثم أنه عندما كتب هذا السطر:

class->name = name;

قمت بتجاهل هذه الذاكره (لم تستخدمها ... و لم تحررها - free ) و بالتالى أصبح لدينا مشكلتان ...

الأولى أن الذاكره التى تم حجزها في السطر السابق لم يعد هناك أي مؤشر يشير عليها ..

أما الثانيه .. قمت بجعل class->name يشير إلى ال char* المرسل من الداله (بدل من أن تقوم بنسخه بإستخدام strcpy مثلا)

نأتى للداله الأخري

int main(void){
	__class* class  = new("Barakat");

	class->say("Hello world!");
	printf("My name is %s\n", class->name);

	free(class);
	return(0);
}

السطر

free(class);

بإعتبار أنك راعيت ما ذكرتُه سابقا, فإنك هنا أيضا وقعت في خطأ ... فقمت بتحرير الذاكره المحجوزه لل struct __class و لم تحرر ذاكرة العضو name ( و التى قمت بحجزها)

بمعنى أخر .... هناك عدد 2 malloc و فقط عدد 1 free ... يجب أن يكون عددهما متساويان

بس وين الوراثة في كودك او حماية ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…