2016-02-06 6 views
0

Ive использовал C++ в течение нескольких месяцев, но Ive сталкивается с ошибкой, когда я использую файлы заголовка и исходного кода. Я создаю файл исходного кода , который содержит класс пистолет (например, не текущая программа):Объявления классов в заголовочных файлах

class gun 
{ 
private: 
int stuff; 
public: 
void doStuff(); 
}; 


void Gun::doStuff() 
{ 
cout << stuff << endl; 
} 

, а затем я создал файл заголовка и объявил класс как это:

class gun; 

то в моем основной исходный файл я это сделать:

int main() 
{ 
gun *mygun = new gun; 
mygun->doStuff(); 
return 0; 
} 

однако, когда я пытаюсь выполнить его я получаю сообщение об ошибке: недопустимого использования неполного типа «класс пистолета» и я думаю, что й Проблема в том, как я объявила его в заголовке, я сделал это неправильно? как я хотел это сделать? Благодарю.

Спасибо всем, кто помог! Теперь я понимаю, я думал, что только форвардная декларация попала в заголовочный файл, спасибо за все ваши ответы!

+0

'Gun :: DoStuff()' должен быть ' gun :: doStuff() ' –

+0

Все определение класса -' clas s gun {...}; '- переходит в заголовочный файл. Одной только прямой декларации недостаточно для большинства применений. –

+0

Когда вы говорите все определение класса, которое вы имеете в виду как класс gun { закрытый: int stuff; общественность: void doStuff(); }; –

ответ

3

Вы, кажется, собираетесь разделить файл реализации и заголовок неправильным образом. Переменные декларации не должны входить в заголовочный файл. Вся декларация должна! Это как ваш код должен быть структурирован

Gun.hpp

#pragma once 

class Gun 
{ 
private: 
    int stuff; 
public: 
    void doStuff(); 
}; 

Gun.cpp

#include "Gun.hpp" 
#include <iostream> 
using std::cout; 
using std::endl; 

void Gun::doStuff() 
{ 
    cout << stuff << endl; 
} 

main.cpp

int main() 
{ 
    Gun *mygun = new Gun; 
    mygun->doStuff(); 

    delete mygun; // <-- remember this! 
    return 0; 
} 

разделение заголовка и реализации имеет решающее значение на языках C++ и других языках! Вы должны только объявить класс в заголовке наряду с полным интерфейсом (как описано выше) и включают в себя все детали реализации в файле .cpp (как выше :)

+0

Формально то, что вы помещаете в заголовок, является ** определением ** класса, а то, что вы помещаете в исходные файлы, - это ** определение ** каждой функции-члена. –

1

всейдекларации из gun класса должна быть в файле заголовка. То, что вы объявили в файле заголовка, - это объявление forward, которого недостаточно для создания экземпляра класса. Передовые декларации полезны для того, чтобы другой код мог объявлять указатели, так как компилятор не должен знать полную информацию только для объявления указателя. Но форвардное объявление не может использоваться для создания экземпляров реальных объектов класса. Вот почему вы получаете ошибки относительно неполного типа. С точки зрения main() она понятия не имеет, как выглядит gun, поэтому он не может создать полный экземпляр.

реализация методов для gun класса должен быть в исходном файле пистолета, который может #include файл заголовка для проверки и получения доступа к членам класса.

gun.ч

#ifndef gun_h 
#define gun_h 

class gun 
{ 
private: 
    int stuff; 
public: 
    void doStuff(); 
}; 

#endif 

gun.cpp

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

void gun::doStuff() 
{ 
    std::cout << stuff << std::endl; 
} 

Теперь в main() (или любой другой исходный файл), вы можете #include заголовочный файл и использовать класс по мере необходимости:

#include "gun.h" 

int main() 
{ 
    gun *mygun = new gun; 
    mygun->doStuff(); 
    delete mygun; 
    return 0; 
} 
0

В gun.h

#ifndef GUN_H_ 
#define GUN_H_ 
// You can use #pragma once too here 
class gun 
{ 
    private: 
     int stuff; 
    public: 
     void doStuff(); 
}; 

#endif 

В gun.cpp файл

#include "gun.h" 

void gun::doStuff() 
{ 
    cout << stuff << endl; 
} 

, а затем main.cpp

#include "gun.h" 

int main() { 
    //your code using the class 
    gun *mygun = new gun; 
    mygun->doStuff(); 
    return 0; 
} 

и вы можете скомпилировать и протестировать с помощью

g++ -o prg_name gun.cpp main.cpp && ./prg_name 
Смежные вопросы