Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Khai báo class Student

  1. #1
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Mặc định Khai báo class Student

    Đây là bài tập mình vừa được giao cho làm sau đúng 3 ngày học 1 lô kiến thức ạ.


    Khai báo lớp Student theo những yêu cầu sau:

    1. Student phải có tên (string), họ(string) và mã số học sinh (ID: int) đồng thời ID không được bắt đầu bởi số 0. Các biến trên phải là private và chưa được phép initialize.

    2. Lớp student phải có biến public static gọi là numberOfStudents để đếm số học sinh được khởi tạo. Bắt đầu bởi 0.

    3. Khai báo một no-argument constructor:

    - Tăng dần 1 biến public static numberOfStudents

    4. Khai báo một constructor có 3 arguments: tên, họ, và ID

    - Tăng dần 1 biến public static numberOfStudents

    - Asign the construtor argument values to the member variables of the class Student.

    5. Khai báo hai hàm public member functions.

    - getName, dùng để trả về tên họ học sinh (single string từ hai cái string họ và tên)
    - getID, trả về ID của học sinh.
    - Chuyện gì sẽ xảy ra nếu ta thiết lập hai hàm trên ở dạng private?



    Phải khai báo lớp Student ở hai file riêng biệt,

    1. Student.h, bao gồm member variable và khai báo hàm. (function declaration)

    2. Student.cpp, bao gồm định nghĩa các hàm (kể cả constructor)


    Cuối cùng, dùng đoạn code sau để test:

    Code:
    #include <iostream>
    #include <string>
    using namespace std;
    #include "Student.h"
    
    main()
    {
          Student st1("Hakan", "Haberdar", 1234), st2("Charu", "Hans", 2345), st3("Tarikul", "Islam", 5442), st4;
          cout << "We created " << Student::numberOfStudents << " student objects." << endl;
          cout << st1.getID() << " " << st1.getName() << endl;
          cout << st2.getID() << " " << st2.getName() << endl;
          cout << st3.getID() << " " << st3.getName() << endl;
          cout << st4.getID() << " " << st4.getName() << endl;
          
    system("pause");
    }


    Output should be:

    Code:
    We created 4 student objects.
    
    1234 Hakan Haberdar
    2345 Charu Hans
    5442 Tarikul Islam
    0
    Press any key to continue...


    Thông cảm vì có một số đoạn mình không biết dịch việt thế nào ạ.

    Vừa mới học được một tí về operator, construtor, class, static member.


    Cám ơn mấy anh chị nhiều ạ.

  2. #2
    Ngày gia nhập
    07 2009
    Bài viết
    48

    Của bạn đây

    Student.h
    Code:
    #include <string>
    using namespace std;
    
    class Student {
    public:
        Student();
        Student(string firstName,string lastName,unsigned int id);
        virtual ~Student();
        static int numberOfStudents;
    private:
        string mStudentFirsName;
        string mStudentLastName;
        int mStudentID;
        
    public:
        void setStudentFirstName(string name);
        void setStudentLastName(string lastName);
        void setStudentId(unsigned int id);
        
        string getStudentFirstName();
        string getStudentLastName();
        int getStudentID();
    };
    Student.cpp
    Code:
    #include "Student.h"
    int Student::numberOfStudents = 0;
    Student::Student() {
        this->mStudentFirsName = "";
        this->mStudentLastName = "";
        this->mStudentID = 0;
        Student::numberOfStudents += 1;
    }
    
    Student::Student(string firstName,string lastName,unsigned int id) {
        this->mStudentFirsName = firstName;
        this->mStudentLastName = lastName;
        this->mStudentID = id;
        Student::numberOfStudents += 1;
    }
    
    Student::~Student() {
    }
    
    void Student::setStudentFirstName(string name){
        this->mStudentFirsName = name;
    }
    
    void Student::setStudentLastName(string lastName){
        this->mStudentLastName = lastName;
    }
    
    void Student::setStudentId(unsigned int id){
        this->mStudentID = id;
    }
    
    int Student::getStudentID(){
        return Student::mStudentID;
    }
    
    string Student::getStudentFirstName(){
        return this->mStudentFirsName;
    }
    
    string Student::getStudentLastName(){
        return this->mStudentLastName;
    }
    - Nếu hai hàm getName và getID mà được thiết lập là private thì ta chỉ gọi được hai hàm này ở bên trong phạm vi của lớp Student mà không thể gọi được từ bên ngoài, tức là trong hàm main thì các lệnh st1.getID, st1.getName ... sẽ không có tác dụng và sẽ bị trình biên dịch báo lỗi. Do các thuộc tính của lớp đặt là private nên phải sinh ra các hàm set/get là public để tác động lên các thuộc tính này. Đây là nguyên lý của lập trình hướng đối tượng

  3. #3
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi gabk Xem bài viết
    public:
    Student();
    Student(string firstName,string lastName,unsigned int id);
    virtual ~Student();
    static int numberOfStudents;
    private:
    string mStudentFirsName;
    string mStudentLastName;
    int mStudentID;

    ======

    #include "Student.h"
    int Student::numberOfStudents = 0;
    Student::Student() {
    this->mStudentFirsName = "";
    this->mStudentLastName = "";
    this->mStudentID = 0;
    Student::numberOfStudents += 1;

    }

    Student::Student(string firstName,string lastName,unsigned int id) {
    this->mStudentFirsName = firstName;
    this->mStudentLastName = lastName;
    this->mStudentID = id;
    Student::numberOfStudents += 1;
    }


    Mình không hiểu 1 vài thứ.

    In đậm 1: Mình chưa học hàm đó. virtual là gì? "~" là gì?

    In đậm 2: có cần mục đó hay không ạ? hay mình cứ student::student() {} là được?

    3: về phần getName, đề bài có nói là in ra Last name và First Name return to a single string. Mình không thấy trong đoạn code.

    Vậy cho mình hỏi, có cần dùng operator để làm cái đó ko? Kiểu như

    Code:
    main()
    {
    .
    .
    .
    cout<<mgetName<<endl;
    
    }
    
    string Student::operator<< (string LastName, string FirstName)
    {
    cout<<LastName<<" "<<First Name<< endl;
    
    return *this;
    }

    In đậm 3: cái
    Code:
    this -> .....
    là cái gì ạ?

  4. #4
    Ngày gia nhập
    07 2009
    Bài viết
    48

    1. Về cái hàm hủy virtual thì bạn chưa cần chú ý, sau này học sâu hơn bạn sẽ hiểu, mình ko giải thích sợ bạn rối lên, cái đó khi dùng trình dịch tao lớp nó sẽ tự sinh cho mình

    2. còn cái này:
    Code:
    this->mStudentFirsName = "";
    this->mStudentLastName = "";
    this->mStudentID = 0;
    chẳng qua là mình khởi tạo một giá trị mặc định cho các thuộc tính théo ý của mình thôi (thói quen của mình thôi, còn không có thì cũng không sao cả)

    3. Sorry mình không để ý. Muốn return single string thì đơn giản thôi, bạn viết hàm thế này:
    Code:
    string Student::getName(){
        return (this->mStudentFirstName + "\t" + this->mStudentLastName);
    }
    Còn this là cái gì thì bạn tìm hiểu thêm về con trỏ this. Không có cái này cũng được, chẳng qua nó là thói quen viết code của mình thôi

  5. #5
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi gabk Xem bài viết
    1. Về cái hàm hủy virtual thì bạn chưa cần chú ý, sau này học sâu hơn bạn sẽ hiểu, mình ko giải thích sợ bạn rối lên, cái đó khi dùng trình dịch tao lớp nó sẽ tự sinh cho mình

    2. còn cái này:
    Code:
    this->mStudentFirsName = "";
    this->mStudentLastName = "";
    this->mStudentID = 0;
    chẳng qua là mình khởi tạo một giá trị mặc định cho các thuộc tính théo ý của mình thôi (thói quen của mình thôi, còn không có thì cũng không sao cả)

    3. Sorry mình không để ý. Muốn return single string thì đơn giản thôi, bạn viết hàm thế này:
    Code:
    string Student::getName(){
        return (this->mStudentFirstName + "\t" + this->mStudentLastName);
    }
    Còn this là cái gì thì bạn tìm hiểu thêm về con trỏ this. Không có cái này cũng được, chẳng qua nó là thói quen viết code của mình thôi
    Vậy mấy phần
    Code:
    this->
    mình nếu bỏ qua ko viết thì phần code vẫn như cũ, chỉ bỏ chữ đó phải không bạn? Tại cả virtual lẫn this-> bà cô bả chưa giảng. Làm vào bả cho zero ạ ~.~


    nếu thế thì đoạn code string trên, mình viết thế này..

    Code:
    string Student::getName(){
        return (mStudentFirstName + "\t" + mStudentLastName);
    }
    vẫn đúng phải không bạn?

  6. #6
    Ngày gia nhập
    07 2009
    Bài viết
    48

    Mặc định Khai báo class Student

    Đúng rồi, nếu không thích this thì bỏ đi, code vẫn như cũ, phần hàm hủy cũng bỏ từ khóa virtual đi (cái này chỉ có ý nghĩa khi kế thừa thôi). Lần sau muốn thử bỏ/thêm cái gì tốt nhất chạy chương trình luôn sẽ rõ bạn ạ

  7. #7
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Mình đã thử chỉnh lại hết.


    Student.h
    Code:
    #include <string>
    using namespace std;
    
    class Student {
    public:
        Student();
        Student(string FirstName,string LastName, int id);
        
        static int numberOfStudents;
    private:
        string FirstName;
        string LastName;
        int ID;
        
    public:
        void setFirstName(string name);
        void setLastName(string lastName);
        void setID(int id);
        
        string getFirstName();
        string getLastName();
    	string getName();
    	
    
        int getID();
    };

    Student.cpp

    Code:
    #include "Student.h"
    int Student::numberOfStudents = 0;
    Student::Student() {
        
        Student::numberOfStudents += 1;
    }
    
    Student::Student(string FirstName,string lastName, int id) {
        FirstName = FirstName;
        LastName = LastName;
        ID = id;
        Student::numberOfStudents += 1;
    }
    
    
    void Student::setFirstName(string FirstName){
        FirstName = FirstName;
    }
    
    void Student::setLastName(string lastName){
        LastName = LastName;
    }
    
    void Student::setID( int id){
        ID = id;
    }
    
    
    
    int Student::getID(){
        return Student::ID;
    }
    
    string Student::getFirstName(){
        return FirstName;
    }
    
    string Student::getLastName(){
        return LastName;
    }
    
    string Student::getName(){
        return (this->FirstName + "\t" + this->LastName);
    }
    Nhưng lúc compile thì nó bị thế này.

    Code:
    We created 4 student objects.
    
    1234
    2345 
    5442
    -858993460
    Press any key to continue...
    Nghĩa là phần getName bị sai ạ? Mình ko rõ lắm viêc cộng string type có dc hay không? Hay là cần phải định nghĩa lại phép cộng đó?

  8. #8
    Ngày gia nhập
    07 2009
    Bài viết
    48

    Bạn viết không sai (trong hàm getName cũng bỏ luôn this đi), mình chạy thấy vẫn bình thường mà. Có lẽ nào hàm main bạn thiếu cái gì. Mình bê nguyên hàm main của bạn vào nó thế này
    Code:
    int main(int argc, char** argv) {
        Student::numberOfStudents = 0;
        Student st1("Hakan","Haberdar",1234),st2("Charu","Hans",2345),st3("Tarikul","Islam",5442),st4;
        cout<<"We created "<<Student::numberOfStudents<<" student objects."<<endl;
        cout<<st1.getStudentID()<<"\t"<<st1.getName()<<endl;
        cout<<st2.getStudentID()<<"\t"<<st2.getName()<<endl;
        cout<<st3.getStudentID()<<"\t"<<st3.getName()<<endl;
        cout<<st4.getStudentID()<<"\t"<<st4.getName()<<endl;
        return 0;
    }
    Kết quả nó ra thế này
    Code:
    We created 4 student objects.
    1234    Hakan   Haberdar
    2345    Charu   Hans
    5442    Tarikul Islam
    0
    
    RUN SUCCESSFUL (total time: 352ms)
    Nếu bạn viết hàm main như của mình mà vẫn sai thì bạn post code của bạn lên đây mình chạy thử xem

  9. #9
    Ngày gia nhập
    01 2013
    Bài viết
    1

    Nguyên post trên là mình dựa vào của bạn để viết đó.

    Hàm name:

    Code:
    #include <iostream>
    #include <string>
    using namespace std;
    #include "Student.h"
    
    void main()
    {
          Student st1("Hakan", "Haberdar", 1234), st2("Charu", "Hans", 2345), st3("Tarikul", "Islam", 5442), st4;
          cout << "We created " << Student::numberOfStudents << " student objects." << endl;
          cout << st1.getID() << " " << st1.getName() << endl;
          cout << st2.getID() << " " << st2.getName() << endl;
          cout << st3.getID() << " " << st3.getName() << endl;
          cout << st4.getID() << " " << st4.getName() << endl;
          
    system("pause");
    }

  10. #10
    Ngày gia nhập
    07 2009
    Bài viết
    48

    Sai ở cái hàm tạo của bạn ạ
    Code:
    Student::Student(string FirstName,string lastName, int id) {
        FirstName = FirstName;
        LastName = LastName;
        ID = id;
        Student::numberOfStudents += 1;
    }
    Ở đây biến cục bộ trùng với thuộc tính của lớp nên lệnh gán của bạn sẽ ko có tác dụng, nếu như bạn để tên biến như thế này thì phải thêm con trỏ this (this->FirstName = FirstName) thì chương trình mới hiểu được. Tốt nhất bạn đừng nên đặt tên biến truyền vào trùng với tên thuộc tính. Bạn thử lại xem

Các đề tài tương tự

  1. lỗi khai báo của class trong C++
    Gửi bởi boymafia1993 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 13
    Bài viết cuối: 11-10-2012, 12:33 AM
  2. Hỏi về cách khai báo 1 class
    Gửi bởi phongbv trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 13-07-2012, 10:09 AM
  3. Cách khai báo kỳ lạ cho thuộc tính của class
    Gửi bởi nhuan07 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 14
    Bài viết cuối: 17-05-2011, 08:39 AM
  4. Hương dẫn cách khai báo class
    Gửi bởi vanhieppro trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 26-05-2010, 05:57 PM
  5. Khai báo new lại rồi mà sao vẩn chạy hàm ở class cơ sở (bài kế thừa) ?
    Gửi bởi vuonghao77 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 26-04-2010, 05:58 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn