باستخدام Ostream كمرجع (C ++)
-
26-09-2019 - |
سؤال
لديّ مهمة منزلية حيث يتم توفير ملف الرأس إلينا ، ولا يمكن تغييره. أواجه مشكلة في معرفة كيفية استخدام وظيفة "العرض" بشكل صحيح ، لذا فإليك الرمز ذي الصلة.
ملف الرأس:
#ifndef SET_
#define SET_
typedef int EType;
using namespace std;
#include <iostream>
class Set
{
private:
struct Node
{
EType Item; // User data item
Node * Succ; // Link to the node's successor
};
unsigned Num; // Number of user data items in the set
Node * Head; // Link to the head of the chain
public:
// Various functions performed on the set
// Display the contents of the set
//
void display( ostream& ) const;
};
#endif
إليكم تنفيذ وظيفة "العرض":
void Set::display( ostream& Out ) const
{
Node * temp = Head;
cout << "{ ";
while( temp != NULL )
{
cout << temp << ", ";
temp = temp->Succ;
return Out;
}
}
وهنا سائقي:
#include <iostream>
#include <iomanip>
#include "/user/cse232/Projects/project08.set.h"
using namespace std;
int main()
{
Set X;
X.insert(10);
X.insert(20);
X.insert(30);
X.insert(40);
X.display();
}
يقول الخطأ الذي أتلقاه إنه في برنامج التشغيل الخاص بي ، لا أستخدم المعلمات الصحيحة. أنا أفهم هذا لأن ملف .h يستخدم ostream وكمعلمة. سؤالي هو ، ما الذي أستخدمه في ملف برنامج التشغيل الخاص بي عند استدعاء "العرض" كمعلمة جيدة؟
المحلول
كما قلت ، display
يتوقع معلمة من النوع std::ostream &
.
في تطبيق طريقة العرض الخاص بك ، يمكنك الإخراج في std::cout
الذي يتحدى منطق استلام دفق الإخراج كمعلمة للطريقة. هنا ، الهدف من المعلمة هو أن display
سيتمكن المتصل من توفير دفق الإخراج الذي يختاره. إذا كان اختياره هو الإخراج القياسي ، فسوف يكتب:
x.display(std::cout);
هذا يعني أن الخاص بك display
يجب أن يخرج التنفيذ فقط في Out
المعلمة وليس std::cout
.
لاحظ أيضًا أن:
- لك
display
يقوم التنفيذ بإرجاع قيمة ، لا ينبغي لها (void
نوع العودة) - انا استعمل ال
std::
بادئة في إجابتي من أجل الوضوح ، لكنها غير مطلوبة في قضيتك لأن ملف الرأس يحتوي على أusing namespace std;
.
نصائح أخرى
ما عليك القيام به هو استبدال جميع الأماكن التي استخدمتها Cout. أيضًا تمرير Cout كمعلمة مثل X.Display (cout). هذا لأنه ، cout هو Off -Type Ostream ويتم كل هذا التهيئة في ioStream.
في طريقة العرض الخاصة بك ، أنت تستخدم صراحة. ولكن هذا هو "المعيار". يجب أن تستخدم الطريقة بدلاً من ذلك. لذلك في Display () ، فقط استبدل كل حدوث Cout مع Out.
ثم استخدم العرض (cout) ؛ في مكالمتك
أنت لا تمر في كائن Ostream. تغييره إلى هذا:
X.display(cout);
ثم في الفصل الخاص بك استبدل جميع حوادث cout. أيضًا ، يجب أن تُرجع وظيفة العرض const ostream وبدلاً من الفراغ. يجب أن تستخدم أيضًا مراجع Const Ostream بدلاً من Ostream.
من المعتاد استخدام مشغل خارج الفصل:
const ostream & operator<< (const ostream & Out, const Set & set)
{
// display your Set here using out, not cout
return out;
}
بهذه الطريقة يمكنك أن تفعل أشياء مثل:
cout << "This is my set: " << mySet << endl;