2012-03-13 37 views
5

Heres lỗi của tôi ...lỗi: không có chức năng phù hợp cho cuộc gọi đến

"Trong constructor 'NumGame :: NumGame (int &): lỗi: không có chức năng phù hợp cho cuộc gọi đến 'Chuyên mục :: Thể loại () '"

Tôi đã xem xét một số câu hỏi tương tự ở đây nhưng không thể dường như tìm thấy câu trả lời. Tôi có một loại lớp cơ sở và NumGame được thừa hưởng từ nó nhưng sẽ không biên dịch.

class Category { 

public: 
    void virtual selection(int&); 
    Category(int&); 
    virtual ~Category(){}; 
private: 
    int myRandNum; 
}; 

Category::Category(int& a){ 
    myRandNum = a; 
} 

void Category::selection(int& a){ 
    cout << "I am NumGame version number... " << a << endl; 
    cout << "Now Im playing... " << myRandNum << endl; 
} 

class NumGame : public Category { 

public: 
    void selection(int&); 
    NumGame(int&); 
    ~NumGame(){}; 
private: 
    int myRandNum; 
}; 

NumGame::NumGame(int& b){ 
    myRandNum = b; 
} 

void NumGame::selection(int& b) { 

} 

Trả lời

9

Category không có một constructor mặc định, vì vậy bạn cần phải cung cấp luận cứ khi xây dựng đối tượng cơ sở Category của NumGame:

NumGame::NumGame(int& b) : 
    Category(b) 
{ 
    myRandNum = b; 
} 
+0

Nhưng tôi không chỉ hơn cưỡi constructor mặc định không? Và nếu tôi không vượt qua nó, thì constructor mặc định sẽ được sử dụng thay vì đó là lý do tại sao tôi có đối số trong mặc định. BTW cả hai câu trả lời đã gây ra mã của tôi để biên dịch, rõ ràng là một số điều không rõ ràng với tôi :) – Aikiman001

15

Lý do cho các lỗi:

Khi bạn tạo một thể hiện của lớp bắt nguồn NumGame lớp cơ sở Category không có constructor luận được gọi là để tạo ra các Category phần của đối tượng. Lớp của bạn không có và trình biên dịch phàn nàn về nó.

Tại sao trình biên dịch không tổng hợp hàm tạo mặc định?

Khi bạn cung cấp bất kỳ hàm tạo nào cho lớp của bạn, trình biên dịch không tổng hợp hàm tạo mà không lấy bất kỳ đối số nào cho bạn, Bạn phải cung cấp mã đó sử dụng.

Giải pháp:

Có hai cách để tránh các lỗi:

Gọi constructor sẵn thích hợp trong lớp cơ sở Catoegory subobject qua Member Initializer list. Thao tác này sẽ xóa trường hợp mã của bạn sử dụng một hàm tạo không có đối số.

NumGame::NumGame(int& b) : Category(b) 
{ 

} 

HOẶC

Bạn cần cung cấp một constrcutor không tranh cãi đối với Category lớp mình:

Category::Category() 
{ 

} 
+0

Cảm ơn thats great – Aikiman001

+0

Tuyệt vời, câu trả lời duy nhất trên SO đã giúp tôi sửa lỗi này. : D – lama12345

0

trong lớp NumGame bạn phải cung cấp cuộc gọi tới hàm tạo của lớp cơ sở. nếu bạn không làm, trình biên dịch làm điều đó cho bạn với contructor mặc định: trong trường hợp của bạn Category() mà bạn không có ..

Các vấn đề liên quan