2010-06-03 2 views
8

У меня есть программа C++, и когда я пытаюсь скомпилировать это дает ошибку:C++ - ошибка: ожидается, неквалифицированный-идентификатор, прежде чем «с помощью»

calor.h|6|error: expected unqualified-id before ‘using’| 

Вот файл заголовка для calor класса:

#ifndef _CALOR_ 
#define _CALOR_ 

#include "gradiente.h" 

using namespace std; 

class Calor : public Gradiente 
{ 
public: 
    Calor(); 
    Calor(int a); 
    ~Calor(); 

    int getTemp(); 
    int getMinTemp(); 
    void setTemp(int a); 
    void setMinTemp(int a); 

    void mostraSensor(); 
}; 
#endif 

Почему это происходит?

Этот класс наследует от gradiente:

#ifndef _GRADIENTE_ 
#define _GRADIENTE_ 

#include "sensor.h" 

using namespace std; 

class Gradiente : public Sensor 
{ 
protected: 
    int vActual, vMin; 
public: 
    Gradiente(); 
    ~Gradiente(); 
} 
#endif 

Который, в свою очередь, наследует от sensor

#ifndef _SENSOR_ 
#define _SENSOR_ 

#include <iostream> 
#include <fstream> 
#include <string> 

#include "definicoes.h" 

using namespace std; 

class Sensor 
{ 
protected: 
    int tipo; 
    int IDsensor; 
    bool estadoAlerta; 
    bool estadoActivo; 
    static int numSensores; 
public: 
    Sensor(/*PARAMETROS*/); 
    Sensor(ifstream &); 
    ~Sensor(); 

    int getIDsensor(); 
    bool getEstadoAlerta(); 
    bool getEstadoActivo(); 

    void setEstadoAlerta(int a); 
    void setEstadoActivo(int a); 

    virtual void guardaSensor(ofstream &); 
    virtual void mostraSensor(); 
    // FUNÇÃO COMUM 
    /* virtual int funcaoComum() = 0; 
    virtual int funcaoComum(){return 0;};*/ 
}; 
#endif 

Для полноты, вот definicoes.h

#ifndef _DEFINICOES_ 
#define _DEFINICOES_ 

const unsigned int SENSOR_MOVIMENTO = 0; 
const unsigned int SENSOR_SOM = 1; 
const unsigned int SENSOR_PRESSAO = 2; 
const unsigned int SENSOR_CALOR = 3; 
const unsigned int SENSOR_CONTACTO = 4; 

const unsigned int MIN_MOVIMENTO = 10; 
const unsigned int MIN_SOM = 10; 
const unsigned int MIN_PRESSAO = 10; 
const unsigned int MIN_CALOR = 35; 
#endif 

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

ответ

18

Существует точка с запятой отсутствует в конце этого класса:

class Gradiente : public Sensor 
{ 
protected: 
    int vActual, vMin; 
public: 
    Gradiente(); 
    ~Gradiente(); 
}      // <-- semicolon needed after the right curly brace. 

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

using namespace std; 

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

+0

Спасибо за ваши дополнительные исправления! –

+3

Как раз пояснить, причина, по которой вы никогда не должны использовать «using namespace std» (или что с любым другим пространством имен, если на то пошло), потому что пользователи вашего класса не будут ожидать, что их глобальное пространство имен будет загрязнено всем этим материалом из namespace std, когда они не просили об этом. Обычно вы хотите ограничить количество материалов, которые вы добавляете в глобальное пространство имен в своих заголовках, до минимума, необходимого для выполнения заданий, иначе вы рискуете ввести конфликты имен и другие забавные вещи. – George

10

В gradiente.h вы забыли точку с запятой в конце объявления класса.

Вам нужно это:

class Gradiente : public Sensor 
{ 
    protected: 
     int vActual, vMin; 
    public: 
     Gradiente(); 
     ~Gradiente(); 
}; 

Смотрите дополнительную точку с запятой?

+2

[«Ах, пропавшая точка с запятой ... Единственная причина, по которой девушки будут разговаривать со мной в однодневные дни».] (Http://www.reddit.com/r/programming/comments/b8ws6/) ' :) ' – sbi

4

Вы забыли оставить последнюю полуточку на закрывающих скобках, };, на классе gradiente.

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