كيف يمكنك استخدام مجموعات وتحصل في C ++؟
سؤال
لقد استخدمتها في جافا ولم يكن لديك الكثير من القضايا، لكنني لا أمسك بها جيدا في C ++. المهمة هي:
Write a class named Car that has the following member variables:
year. An int that holds the car's model year.
make. A string that holds the make of the car.
speed. An int that holds the car's current speed.
In addition, the class should have the following member functions.
Constructor. The constructor should accept the car's year and make
as arguments and assign these values to the object's year and
make member variables. The constructor should initialize the
speed member variable to 0.
Accessors. Appropriate accessor functions should be created to allow
values to be retrieved from an object's year, make, and speed
member variables.
accelerate. The accelerate function should add 5 to the speed member
variable each time it is called.
brake. The brake function should subtract 5 from the speed member
variable each time it is called.
Demonstrate the class in a program that creates a Car object, and then
calls the accelerate function five times. After each call to the
accelerate function, get the current speed of the car and display
it. Then, call the brake function five times. After each call to
the brake function, get the current speed of the car and display it.
حتى الآن هذا ما لدي ولكن أنا معقول أنا مخطئ تماما. إذا كان لدى أي شخص أي نصيحة سأقدرها حقا، شكرا!
#include<iostream>
#include<string>
using namespace std;
class Car
{
public:
int year;
string make;
int speed;
Car()
{
setYear(newYear);
setMake(newMake);
setSpeed(0);
}
void setYear(int newYear)
{
year = newYear;
}
void setMake(string newMake)
{
make = newMake;
}
int getYear()
{
return year;
}
string getMake()
{
return make;
}
int accelerate(int speed)
{
return (speed+5);
}
int brake(int speed)
{
return (speed-5);
}
};
int main()
{
return 0;
}
ملاحظة: الرئيس الرئيسي قد عودة 0؛ بحتة كحاولة مكان محاولة لفهم شيء كامل "الحصول على وتعيين".
المحلول
عموما يجب أن تعمل وظائف Get / Set بشكل جيد. بعض التعليقات الأخرى:
- ال
year
,make
وspeed
يجب أن تكون المتغيرات خاصة، وإلا فلن تكون هناك حاجة حقا للحصول على وظائف الحصول على / تعيين لها منذ أن يتم تغيير المتغيرات مباشرة. - ربما لا ينبغي أن يكون هناك أي وظائف مجموعة على الإطلاق. لا أعتقد أنه من المقصود أن يكون ذلك ممكنا
year
أوmake
أو تعيينspeed
مباشرة. - يجب أن يأخذ المنشئ
newYear
وnewMake
كما المعلمات. accelerate()
وbreak()
يجب تغيير ذلكspeed
المحفوظة في كائن السيارة، وليس فقط إرجاع قيمة مختلفة عنspeed
.using namespace std;
يمكن استيراد الكثير من الأسماء غير المتوقعة إلى مساحة الاسم العالمية وغالبا ما يكون من الأفضل استخدام أسماء مؤهلة صراحة مثلstd::string
في حين أن.
نصائح أخرى
بعض المشاكل التي أراها:
أنت تشير إلى المتغيرات في المنشئ لم يتم تمريرها إلى المنشئ (newYear
, newMake
)
ال accelerate
و decelerate
الوظائف لا تعدل أي دولة؛ إنهم يضيفون فقط وطرح 5 من السرعة التي مرت - لا أعتقد أنهم من المفترض أن يتصرف بهذه الطريقة. لاحظ أن وصف المشكلة يقول أنها تضيف إلى / طرح من speed
متغير الأعضاء.
جميع المتغيرات الأعضاء الخاصة بك عامة. هل تفعل هذا في جافا؟
من المحتمل أنك تريد إجراء المتغيرات الداخلية الخاصة نظرا لأنها يجب تحديثها إلا بواسطة الأساليب داخل الفصل. ثانيا، تحتاج إلى معلمات إلى المنشئ بحيث يمكنك ضبط السنة وجعلها في البداية.
السابق:
public:
Car(int newYear, string newMake) {...}
class Car
{
private:
int year;
string make;
int speed;
public:
Car(int newYear, string newMake)
{
setYear(newYear);
setMake(newMake);
setSpeed(0);
}
...
}
أنت أيضا لا تقوم بتحديث قيم السرعة على accelerate
و brake
طرق. يحاول:
return (speed -=5);
أو
return (speed += 5);
ال accelerate()
و brake()
يجب أن تعمل الوظائف على speed
عضو بدلا من مجرد إعادة القيمة المعدلة. هذا يعني تعيين ل speed
حسب الاقتضاء.
أيضا، عادة ما يتم إجراء الأعضاء الذين لديهم مسافرين private
أو protected
بدلا من ترك الجمهور.
يتم استخدام طريقة Getter و Setter لتحقيق تغليف البيانات، بحيث يمكن لأعضاء الفصل فقط الوصول إلى أعضاء البيانات فقط في الفصل.
العديد من التعليقات:
- يجب أن تكون المتغيرات الأعضاء نشر, ، ليس عامة نظرا لأنهم يكسرون في مجال التغليف والهزائم بغرض الوصول إليهم باستخدام وظائف Accessor (Getter / Setter).
- أسماء وظيفتك ومعلمات الوظائف أغميض أسماء المتغيرات الأعضاء الخاصة بك، والتي تؤدي إلى بعض الارتباك. كما هو الحال في جافا حيث تحتاج إلى استخدام
this.x
لتمييز متغير العضو "X" من المعلمة "X"، وبالمثل، ستحتاج إلى استخدامهاthis->x
. وبعد ومع ذلك، يمكن تجنب ذلك إذا كنت تعطي دائما المتغيرات الأعضاء لديك نوعا من البادئة. الاتفاقيتان الشائعة هي متغيرات الأعضاء البادئة مع الشرطة السطرية (مثل اسم المتغير العضو الخاص بك_speed
واستخدامspeed
كاسم معلمة) أو لاستخدام "M" (بالنسبة إلى "عضو") متبوعا بسطر آخر. - أي وظيفة لا تعدل البيانات - أي وظائف "Getter" - جميع وظائف "Getter" - مع الكلمة الرئيسية مقدار ثابت, ، بحيث يمكن الوصول إلى هذه البيانات من
const Car
أوconst Car&
. وبعد على سبيل المثال، استخدمint getSpeed()const
بدلا منint getSpeed()
أن تعلن أنه ثابت.