2013-07-05 34 views
6

Tôi gặp sự cố khi truy cập một hàm từ một lớp với đối tượng lớp trong chính của tôi. Tôi chỉ cố gắng tạo đối tượng cho lớp và sử dụng đối tượng đó để truy cập hàm bên trong tệp .cpp của lớp đó. Tôi tiếp tục gặp lỗi và thậm chí tôi đã thực hiện chương trình đơn giản nhất để kiểm tra và tôi vẫn gặp lỗi.Lớp C++ không có thành viên tên là

chính:

#include <iostream> 
#include "Attack.h" 

using namespace std; 

int main() 
{ 
    Attack attackObj; 
    attackObj.printShiz(); 
} 

Lớp tiêu đề

#ifndef ATTACK_H 
#define ATTACK_H 

class Attack 
{ 
    public: 
     Attack(); 
     void printShiz(); 
    protected: 
    private: 
}; 

#endif // ATTACK_H 

Lớp cpp

#include <iostream> 
#include "Attack.h" 
using namespace std; 

Attack::Attack(){ 

} 

void Attack::printShiz(){ 
    cout << "Test" << endl; 
} 

Làm thế nào để khắc phục lỗi này? Mỗi khi tôi cố gắng truy cập chức năng printShiz trong lớp Attack bằng cách sử dụng một đối tượng trong chính của tôi, tôi nhận được một lỗi và nó không nghĩ rằng chức năng này tồn tại trong lớp này.

Lỗi:

error: 'class Attack' has no member named 'printShiz' 
+1

Mã có vẻ tốt. Có lẽ nó đang cố gắng sử dụng một phiên bản cũ của tiêu đề. – chris

+3

Đôi khi một "Xây dựng lại tất cả" sửa chữa mọi thứ. – johnchen902

+0

Chỉ cần thử nó, nhận được cùng một lỗi:/ – Rapture686

Trả lời

0

Bạn có nhớ bao gồm nẹp kết thúc trong chính?

#include <iostream> 
#include "Attack.h" 

using namespace std; 

int main() 
{ 
    Attack attackObj; 
    attackObj.printShiz(); 
} 
+0

Có đó là, tôi chỉ vô tình để nó ra khỏi bài viết. – Rapture686

-1

Cố gắng xác định các chức năng ngay vào tiêu đề

#ifndef ATTACK_H 
#define ATTACK_H 

class Attack { 
    public: 
     Attack(){}; 
     void printShiz(){}; 
    protected: 
    private: }; 

#endif // ATTACK_H 

và biên dịch. Nếu trình biên dịch không phàn nàn về các định nghĩa trùng lặp, điều đó có nghĩa là bạn quên biên dịch tệp Class.cpp, thì bạn chỉ cần thực hiện nó (thêm nó vào Makefile/project/solution ... mà bạn đang sử dụng?)

+0

Chuỗi công cụ tôi đang sử dụng là mingw32-g ++. Exe – Rapture686

+0

Bạn biên dịch nó như thế nào? Hiển thị cho chúng tôi dòng lệnh – doctorlove

+1

Nếu anh ta "quên biên dịch Class.cpp" có thể cung cấp lỗi liên kết tham chiếu chưa xác định, không phải lỗi biên dịch được hiển thị –

10

Tôi gặp sự cố tương tự. Nó bật ra, tôi đã bao gồm một tập tin tiêu đề cũ của cùng một tên từ một thư mục cũ. Tôi đã xóa tệp cũ đã thay đổi #include chỉ thị để trỏ đến tệp mới của tôi và tất cả đều tốt.

+0

Đây là câu trả lời đúng cho câu hỏi. Thỉnh thoảng no xảy ra. Bạn sao chép một tệp tiêu đề sang một đường dẫn khác và thay đổi nó, nhưng vì một nơi nào đó trong dự án của bạn, bạn bao gồm tiêu đề cũ, các thay đổi đối với các hàm thành viên, các biến vv không bao giờ xuất hiện và bạn nhận được loại lỗi "lạ" này. –

-1

Tôi biết đây là một năm cũ nhưng tôi chỉ gặp nó với cùng một vấn đề. Vấn đề của tôi là tôi không có một hàm tạo trong tệp triển khai của mình. Tôi nghĩ rằng vấn đề ở đây có thể là dấu chú thích ở cuối tệp tiêu đề sau #endif ...

0

Bạn có lỗi đánh máy trong .h? Tôi đã từng gặp lỗi này khi tôi có phương thức được gọi chính xác trong chính của tôi, nhưng với lỗi đánh máy trong .h/.cpp (a "g" so với "q" trong tên phương thức, điều này khiến bạn khó có thể nhận ra). Thuộc danh mục "lỗi sao chép/dán".

0

Tôi không thể tìm thấy câu trả lời cho câu hỏi, vì vậy tôi đã thử và không có lỗi.

tôi biên soạn như như thế này:

g++ -c class.cpp

g++ -c main.cpp

g++ -o main class.o main.o

Không có lỗi, hoạt động tốt. phiên bản gcc được sử dụng để biên dịch. phiên bản gcc 4.1.2 20080704 (Mũ Đỏ 4.1.2-46)

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