2013-05-31 2 views
-1

Я начал изучать C++ и застрял при работе с несколькими файлами. Практиковать основные классы, я написал три разных файла,Как построить двоичный файл из нескольких файлов C++?

  • working.cpp
  • word.cpp
  • word.h

word.cpp:

#include <iostream> 
#include "word.h" 
using namespace std; 
class word{ 

public: 
char *word; 

void createWord(char *str) 
{ 
    word = str; 
} 

void print_word(void) 
{ 
    cout<<word<<endl; 
} 

char * getWord() 
{ 
    return word; 
} 

}

working.cpp

#include <iostream> 
#include "word.h" 
void printWord(word); 
using namespace std; 
int main() 
{ 
word one; 
one.createWord("one"); 

printWord(one); 

} 

void printWord(word a) 
{ 
cout<<a.getWord()<<endl; 
} 

word.h

class word; 

Это три разные файлы, так что я не уверен, как собрать их. То, что я пытался это
g++ working.cpp word.cpp

Однако компилятор не распознает слово как класс, и дает мне следующие ошибки

working.cpp: In function 'int main()': 
working.cpp:7:7: error: aggregate 'word one' has incomplete type and cannot be defined 
working.cpp:7:12: error: aggregate 'word two' has incomplete type and cannot be defined 
working.cpp:7:17: error: aggregate 'word three' has incomplete type and cannot be defined 
working.cpp: In function 'void printWord(word)': 
working.cpp:19:6: error: 'aha' has incomplete type 
In file included from working.cpp:2:0: 
word.h:2:7: error: forward declaration of 'class word' 
word.cpp:25:1: error: expected ';' after class definition 

Что я делаю неправильно во время компиляции?

+2

Начните с хорошей книги, есть много проблем с кодом. – lekroif

ответ

4
  1. В заголовочном файле вам необходимо включить определение определения word. Что-то вроде этого:

    class word 
    { 
    public: 
        char *word; 
        void createWord(char *str); 
        void print_word(void); 
        char * getWord(); 
    }; 
    
  2. Затем измените word.cpp только иметь реализации:

    void word::createWord(char *str) 
    { 
        word = str; 
    } 
    
    void word::print_word(void) 
    { 
        cout<<word<<endl; 
    } 
    
    char * word::getWord() 
    { 
        return word; 
    } 
    
  3. компиляция и компоновка!

Вы должны иметь больше word класса в заголовке, чтобы ваш другой блок перевода может знать, насколько большим класс (для резервирования достаточно мест для экземпляра, который вы создаете), а также знать, имена методов, которые вы хотите вызвать.

+0

Спасибо, я пробовал, и это сработало. Я немного привык к тому, как классы определены на более высокоуровневых языках, поэтому меня путают во время написания классов. – iamseiko

3

Недостаточно упомянуть имя класса в файле заголовка (так называемое заявка на перенаправление); Вам необходимы полное объявление класса (который декларирует все поля и функцию класса):

class word { 
public: 
    char *word; 
    void createWord(char *str); 
    void print_word(void); 
    char * getWord(); 
}; 
3

Там нет фактического объявления класса word в word.h

word.h:2:7: error: forward declaration of 'class word' 

Я бы советовал читать Бьярню Чтобы начать работу, блестящая книга Строуступа «Язык программирования C++».

+0

спасибо, я проверю книгу. – iamseiko

Смежные вопросы