(Ошибка переопределения) Создайте несколько наследуемых классов из одного базового класса в C++

Приветствую, о могучие кодеры,

Я новичок и у меня тут проблемы.

Вот мой базовый класс (sensor.h):

class sensor
{
private:
   int sensor_id;
   string sensor_name;
   string sensor_type;
   float reading;

public:

   sensor();
   sensor(int, char*, char*);
   ~sensor();

/* Few extra methods here */

};

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

 #include "sensor.h"


class temperaturesensor:public sensor
{
public:
   Temperatursensor(int, char*,char*);
   ~Temperatursensor();

/* Few extra methods here */

};

Дело в том, что каждый из этих классов должен находиться в своем собственном файле .cpp/.h, а затем включаться и использоваться в моем main.cpp.

using namespace std;
#include <xyz.h>
/* Other libaries here */
          ....
#include "temperaturesensor.h"
#include "humiditysensor.h"

int main()
{
    sensor* station[2];


    station [0] = new temperaturesensor(x,y,z);
    station [1] = new humiditysensor(x,y,z);
}

Если я включу один из них, это не имеет большого значения. Однако: если я использую несколько, я получаю ошибку переопределения.

ошибка C2011: «датчик»: переопределение типа «класс» c:\users\name\desktop\project\sensor.h 14

error c2011: 'temperaturesensor' : 'class' typeredefinition 

Что я могу сделать, чтобы обойти это? Обратите внимание, что мне не разрешено использовать #pragma один раз

Извините за мою глупость и заранее спасибо!


person Cnewbie    schedule 29.06.2017    source источник
comment
Вы можете использовать стандартный include guards вместо непереносимого #pragma once.   -  person Bathsheba    schedule 29.06.2017
comment
Добро пожаловать в Stack Overflow. Пожалуйста, найдите время, чтобы прочитать Тур и обратиться к материалам из Справочный центр что и как здесь можно спросить.   -  person πάντα ῥεῖ    schedule 29.06.2017
comment
У вас есть включить защиту или #pragma once в ваших заголовочных файлах?   -  person Some programmer dude    schedule 29.06.2017
comment
Вы помните, что этот массив нумеруется от 0?   -  person 21koizyd    schedule 29.06.2017
comment
И не могли бы вы отредактировать свой вопрос показать ошибки? Скопируйте и вставьте их (как текст).   -  person Some programmer dude    schedule 29.06.2017
comment
Поскольку вы используете std::string в своем классе, используйте std::string в параметрах вашего конструктора. Компилятор может преобразовывать char * в std::string, поэтому вы можете вызывать конструктор с символьными литералами.   -  person Thomas Matthews    schedule 29.06.2017
comment
Кстати, station[2] - это доступ за пределами границ и, следовательно, неопределенное поведение. Предположительно, вы имели в виду использование индексов 0 и 1, а не 1 и 2.   -  person Walter    schedule 29.06.2017


Ответы (3)


Вы должны использовать:

#ifndef FILE_H
#define FILE_H

.. normal code here

#endif

or

#pragma once

но я также думаю, что этот датчик должен быть абстрактным классом, и вы должны использовать виртуальный деструктор. Еще одно мнение состоит в том, что массив нумеруется от 0.

person 21koizyd    schedule 29.06.2017
comment
Хороший улов для индексации массива! Однако я не вижу необходимости в абстрактном базовом классе. - person AGN Gazer; 29.06.2017
comment
Не создавайте символы с начальным подчеркиванием, за которым следует заглавная буква, зарезервированы во всех областях. - person Some programmer dude; 29.06.2017
comment
@AGNGazer Я вижу этот абстрактный датчик класса и специализацию на конкретных датчиках. - person 21koizyd; 29.06.2017

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

Итак, просто сделайте

#pragma once

или нормальный включить защиту

#ifndef YOURFILENAME_H
#define YOURFILENAME_H

.. normal code here

#endif

Тогда у вас не будет ошибки множественного определения.

person Tomaz Canabrava    schedule 29.06.2017

Определение класса sensor взято как из «temporarysensor.h», так и из «humiditysensor.h». Используйте защиту https://en.wikipedia.org/wiki/Include_guard или #pragma once: https://en.wikipedia.org/wiki/Pragma_once

person AGN Gazer    schedule 29.06.2017