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

مشكلة في إرسال ال Objects

مغلق
بدأه Wase3 Sadr في 1 أبريل 2005 · 4 رد · 451 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

إخواني .. حبيت أطرح عليكم هالسؤال ..

أنا عرّفت class من نوع Student على هذا النحو :

#ifndef Student_H
#define Student_H
#include <string>
using std::string;

class Student
{
	int id;
	string name;
	float gpa;

public:
	Student(){id=0; name=""; gpa=0.0;}
	void addStudent(int , string , float);
	int getId(){return id;}
	void printStudemt();
};

#endif

وأيضا .. عرّفت Node و List على هذا النحو :

#ifndef List_H
#define List_H

#include "Student.h"
#include <iostream>

class Node 
{
public:
	Student data;
	Node *next;
	Node ( Student d , Node *n=0 ):data(d),next(n){}
};

class List 
{
	Node *head;
	int count;

public:
	// Constructor , Copy Constructot , Descrouctor
	List (){head =0; count = 0;}

	// Operation
	void insert(const Student&);
	void remove (Student &);
	void print();
	void printByName();
	void printById(int);
};

#endif

ولكن .. عند إستخدامي لداله insert لإضافة student جديد ..

كتبتها بهذا الشكل :

void List::insert(const Student &s)
{
	if (head == 0 )
	{
  head = new Node (s,head);
  count++;
	}

	else
	{
  Node *p=head;

  while (p != 0 && p->next->data.getId() < s.getId() )
 	 p=p->next;
  
  p->next=new Node (s,p->next);
  count++;
	}
}

لكن .. الكومبايلر يظهر لي خطأ غريب !! في السطر هذا :

	while (p != 0 && p->next->data.getId() < s.getId() )

يقول الخطأ :

--------------------Configuration: main - Win32 Debug--------------------
Compiling...
main.cpp
d:\unevirsty\csc113\lab\home work's\lab #6\ex1\list.cpp(18) : error C2662: 'getId' : cannot convert 'this' pointer from 'const class Student' to 'class Student &'
        Conversion loses qualifiers
d:\unevirsty\csc113\lab\home work's\lab #6\ex1\list.cpp(18) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.

main.obj - 2 error(s), 0 warning(s)

رجاءا .. إخباري ما المشكلة !!!

:(

#2

هممم ..

موقع msdn يقول:

http://msdn.microsoft.com/library/default..../html/C2662.asp

اقتباس
Possible cause

Invoking a non-const member function on a const object.

و أرى هنا أن student هو

const Student &s

يعني const!

يقللك:

اقتباس
Possible solutions

Remove the const from the object declaration.

Add const to the member function.

انا اقترح تنفيذ الحل الثاني ..

حسب ما أفهم, لما يكون عندك كائن const معنى هذا انك لا تستطيع تغيير قيمته. و لكن عندما تنادي member function قربما هذا الـ function سيغير قيمته, لذلك يمكنعك من ذلك.

طبعا هنا الـ function لن يغير شيء, لذلك إذا أردت اخبار الـ compiler بأنك الـ function لا يغير شيء, ضع كلمة const بعده:

مثال من الموقع نفسه:

// C2662.cpp
class C
{
public:
   void func1();
   void func2() const;
} const c;

int main()
{
   c.func1();  // C2662
   c.func2();  // no error
}

لاحظ الـ

void func2() const;

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 1 أبريل 2005 في 19:25

#3

للأسف .. نفس الشي :(

لم يتغير أي شي !!

#4

السلام عليكم

الحمد لله تم مسح الفضيحه قبل ان يقرائها احد, انا احياناً اهرف بما لا اعرف ودى مصيبه.

على كل حال اخى الحبيب المشكله فى getId انا تستخدم s.getId ولكن getId لاتضمن عدم تغير الداله s لذاك عليك ان تجعل الداله getId من نوع const بمعنى انك لا تسمح لها بتغير اى شيء داخل الداله وذالك على النحو التالى:

int getId() const {return id;}

نصيحه اخرى إستخدم بدل

public:
Student(){id=0; name=""; gpa=0.0;}

هذه الطريقه

public:
Student():id(0), name("") gpa(0.0){ };

فهى افضل واسرع فى الاداء.

حاول إستخدام const دائماً فى الاماكن التى لاتريد الداله ان تغير شيئ او الكائن تريده ان يبقى على حاله.

هذا ما لدى والحمد لله لم تقراء الرد الاول الذى طرحته وقمت بتحريره, الاول سئل نفسى من إلى كتب الكلام الغريب دا, مجرد كلام لا يحتوى على شيء.

وبعد ما اكتشفت إن انا إلى كتبت الكلام الغريب :o قلت لنفسى انا لازم اعاقب نفسى, فروحت وحبستنى فى اوضه ومنعتنى من الاكل والشرب وفى الاخر صعبت عليا وسامحتنى ورجتنى المنتدى عشان اصلح غلطتى, ودإلوقتى الحمد لله انا راضى عنى وفحان بيا.

>>الراجل دا شكله عنده إنفصام فى الشخصيه<<

تم تعديل هذه المشاركة بواسطة احمد غريب في 1 أبريل 2005 في 22:17

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

كما هو موجود أخوي احمد في الموضوع الاساس ..

انا عرفّت الدالة بالكونست في الأثنين .. :)

هذا الموضوع مغلق.

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