2010-09-19 38 views
10

Xin lỗi cho các bãi chứa mã:Tại sao tôi nhận được định nghĩa lại lỗi lớp này?

gameObject.cpp:

#include "gameObject.h" 
class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 

    gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

    ~gameObject() 
    { 
    // 
    } 
    int add() 
    { 
     return x+y; 
    } 
}; 

gameObject.h:

class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject(); 

    gameObject(int inx, int iny); 
    ~gameObject(); 
    int add(); 
}; 

Lỗi:

||=== terrac, Debug ===| 
C:\terrac\gameObject.cpp|4|error: redefinition of `class gameObject'| 
C:\terrac\gameObject.h|3|error: previous definition of `class gameObject'| 
||=== Build finished: 2 errors, 0 warnings ===| 

tôi không thể tìm ra những gì sai rồi. Cứu giúp?

Trả lời

31

Bạn đang xác định lớp trong tệp tiêu đề, bao gồm tệp tiêu đề vào tệp * .cpp và xác định lớp lần thứ hai vì định nghĩa đầu tiên được kéo vào đơn vị dịch bằng tệp tiêu đề. Nhưng chỉ một định nghĩa lớp gameObject được phép cho mỗi đơn vị dịch.

Bạn thực sự không cần xác định lớp lần thứ hai chỉ để thực hiện các chức năng. Thực hiện các chức năng như thế này:

#include "gameObject.h" 

gameObject::gameObject(int inx, int iny) 
{ 
    x = inx; 
    y = iny; 
} 

int gameObject::add() 
{ 
    return x+y; 
} 

vv

+1

Ahhhh, cảm ơn bạn! – Dataflashsabot

7

thi trong file cpp phải ở trong hình thức

gameObject::gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 
gameObject::gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

gameObject::~gameObject() 
    { 
    // 
    } 
int gameObject::add() 
    { 
     return x+y; 
    } 

không nằm trong một lớp gameObject { } định nghĩa khối

+1

Ngoài sửa lỗi này, các nhà xây dựng nên sử dụng * ctor-initializer-list * và không phải là phần thân của hàm khởi tạo để khởi tạo các biến thành viên. –

+0

hoàn toàn đồng ý (mặc dù không liên quan đến câu hỏi) (+ 1 từ tôi) – frag

0

Bạn xác định class gameObject trong cả 0 của bạntệp và tệp .h của bạn.
Điều đó đang tạo ra lỗi định nghĩa lại.

Bạn nên xác định lớp học, ONCE, trong ONE địa điểm. (quy ước cho biết định nghĩa nằm trong số .h và tất cả việc triển khai nằm trong số .cpp)

Vui lòng giúp chúng tôi hiểu rõ hơn về phần nào của thông báo lỗi mà bạn gặp khó khăn?

Phần đầu tiên của lỗi cho biết lớp học đã được xác định lại trong gameObject.cpp
Phần thứ hai của lỗi cho biết định nghĩa trước đó là trong gameObject.h.

Thông điệp rõ ràng hơn bao nhiêu?

+1

Có thể rõ ràng với bạn, nhưng có thể không rõ ràng đối với người mới –

2

Bạn đang xác định cùng một lớp hai lần là lý do.

Nếu ý định của bạn là thực hiện các phương pháp trong file CPP sau đó làm như vậy một cái gì đó như thế này:

gameObject::gameObject() 
{ 
    x = 0; 
    y = 0; 
} 
gameObject::~gameObject() 
{ 
    // 
} 
int gameObject::add() 
{ 
     return x+y; 
} 
0

Bao gồm một vài tên #ifndef tên #define #endif Preprocessor rằng nên giải quyết vấn đề của bạn. Vấn đề là nó đi từ tiêu đề đến hàm sau đó quay lại tiêu đề để nó xác định lại lớp với tất cả bộ tiền xử lý (#include) nhiều lần.

1

thêm trong tập tin tiêu đề

#pragma once 
+0

Điều này sẽ đạt được điều gì? –

0

Bạn nên quấn file .h như vậy:

#ifndef Included_NameModel_H 

#define Included_NameModel_H 

// Existing code goes here 

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