2010-06-25 29 views
23

Tôi đang gặp sự cố với lớp tôi đang viết. Tôi đã chia lớp thành tệp .h để định nghĩa lớp và tệp .cpp triển khai lớp.lỗi C2039: 'chuỗi': không phải là thành viên của 'std', vấn đề về tệp tiêu đề

tôi nhận được lỗi này trong Visual Studio 2010 Express: C2039

lỗi: 'chuỗi': không phải là thành viên của 'std'

Đây là tiêu đề FMAT.h

class string; 

class FMAT { 
public: 
    FMAT(); 

    ~FMAT(); 

    int session();    

private: 
    int manualSession();  
    int autoSession();  

    int  mode;  
    std::string instructionFile;  

}; 

Đây là tệp triển khai FMAT.cpp

#include <iostream> 
#include <string> 
#include "FMAT.h" 

FMAT::FMAT(){ 

    std::cout << "manually (1) or instruction file (2)\n\n"; 
    std::cin >> mode; 
    if(mode == 2){ 
     std::cout << "Enter full path name of instruction file\n\n"; 
     std::cin >> instructionFile; 
    } 

} 

int FMAT::session(){ 

    if(mode==1){ 
     manualSession(); 
    }else if(mode == 2){ 
     autoSession(); 
    } 

    return 1; 
} 

int FMAT::manualSession(){ 
    //more code 
    return 0; 
} 

đây là tệp chính sử dụng lớp này

#include "FMAT.h" 

int main(void) 
{ 
    FMAT fmat;  //create instance of FMAT class 

    fmat.session();  //this will branch to auto session or manual session 

} 

Không có khả năng khắc phục lỗi này có thể là kết quả của việc tôi không hiểu cách cấu trúc lớp thành các tệp riêng biệt. Vui lòng cung cấp một số mẹo về cách xử lý nhiều tệp trong chương trình C++.

+1

Có thể bạn có nghĩa là "khai báo một lớp" thay vì "xác định". –

Trả lời

19

Bạn cần có

#include <string> 

trong file header too.The tờ khai chuyển tiếp trên riêng của nó không làm đủ.

Cũng nên xem xét cẩn thận vệ sĩ tiêu đề cho tệp tiêu đề của bạn để tránh các vấn đề có thể xảy ra trong tương lai khi dự án của bạn phát triển. Vì vậy, ở trên cùng, hãy làm như sau:

#ifndef THE_FILE_NAME_H 
#define THE_FILE_NAME_H 

/* header goes in here */ 

#endif 

Điều này sẽ ngăn chặn tệp tiêu đề bị # nhiều lần, nếu bạn không có bảo vệ thì bạn có thể gặp sự cố với nhiều lần khai báo.

21

FMAT.h của bạn yêu cầu định nghĩa std :: string để hoàn thành định nghĩa của lớp FMAT. Trong FMAT.cpp, bạn đã thực hiện điều này trước #include <string> trước #include "FMAT.h". Bạn đã không làm điều đó trong tập tin chính của bạn.

Nỗ lực của bạn để chuyển tiếp tuyên bố string không chính xác ở hai cấp độ. Trước tiên, bạn cần một tên đủ điều kiện, std::string. Thứ hai, điều này chỉ làm việc cho con trỏ và tham chiếu, không chỉ cho các biến của kiểu khai báo; một tuyên bố chuyển tiếp không cung cấp cho trình biên dịch đủ thông tin về những gì để nhúng vào lớp mà bạn đang định nghĩa.

+0

Cảm ơn bạn Mark, đặt #include vào tệp .h đã giải quyết được sự cố. Khi chương trình này phát triển về kích thước, tôi có gặp phải vấn đề hay không bằng cách đặt #include trong tệp tiêu đề? Tôi đã nghe nói rằng #includes tất cả nên đi trong tệp .cpp. Có một cách thích hợp để cấu trúc chương trình để tôi sẽ không chạy vào nhiều vấn đề định nghĩa sau này. Chương trình có tồn tại ngay bây giờ (với #include trong tệp tiêu đề) được cấu trúc chính xác không? – Cal

+0

Một giải pháp là có sự phụ thuộc vào '' và buộc mọi nguồn bao gồm 'FMAT.h' để bao gồm nó. Mỗi tệp bao gồm phải bao gồm bảo vệ để ngăn chặn nhiều định nghĩa ngay cả khi bao gồm được thực hiện nhiều lần. –

+0

@Cal Đó là một thực tế tốt cho việc đi kèm trong tệp .cpp nếu có thể. Tuy nhiên nó không phải là một quy tắc có thể được áp dụng ở khắp mọi nơi. Có nhiều tình huống khác nhau ở nơi không thể. Đây là một trong số họ. – TheUndeadFish

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