• 0
محمدهلال

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

سؤال

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 0

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

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

خصائص = Variables ...

عمليات = Functions ...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

لكن مبرمجى السي يتحايلون على ذلك عن طريق إستخدامهم لل 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

لكن مبرمجى السي يتحايلون على ذلك عن طريق إستخدامهم لل 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 والقيم الى هعطية ليه كده

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

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

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

والسلام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

/*
* 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

مثل


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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

مثل


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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

هل يمكن لي أن أصل لمؤشر ال 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
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

هل يمكن لي أن أصل لمؤشر ال 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 ... يجب أن يكون عددهما متساويان

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .