C ++ - где кодировать функцию-член для унаследованного объекта - PullRequest
0 голосов
/ 06 июня 2010

У меня есть несколько классов (heat, gas, contact, pressure), наследуемых от основного (sensor).

У меня есть необходимость хранить их в vector<Sensor *> (часть спецификации).

В какой-то момент мне нужно вызвать функцию, которая без разбора хранит эти Sensor *. (также является частью спецификации, не подлежит обсуждению)

Примерно так:

for(size_t i = 0; i < Sensors.size(); ++i)
    Sensors[i]->storeSensor(os) //os is an ofstream kind of object, passed onwards by reference

Где и как будет определяться storeSensor? 1018 *

Есть ли простой способ сделать это или мне нужно игнорировать спецификацию? Имейте в виду, я новичок!

Спасибо за ваше время!

Ответы [ 4 ]

4 голосов
/ 06 июня 2010

Вам нужно сделать ее чисто виртуальной функцией, которую вы затем реализуете в каждом из производных классов. Реализация может быть довольно простой:

class sensor {
   ....
   virtual void storeSensor( ostream & os ) = 0;
};

class heat : public sensor {
   ....
  void storeSensor( ostream & os ) {
     os << * this;
  }

};

class light : public sensor {
   ....
  void storeSensor( ostream & os ) {
     os << * this;
  }

};

Предполагается, что вы определили подходящий оператор << для каждого из ваших классов. Если нет, вам нужно явно указать переменные-члены конкретного датчика. И это легко: трудность начинается, когда вы хотите снова прочитать датчики: -) </p>

2 голосов
/ 06 июня 2010

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

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

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

1 голос
/ 06 июня 2010

Если все подклассы используют storeSensor () и он всегда принимает один и тот же параметр, вы можете просто объявить его в родительском классе Sensor. Затем сохраните указатель как указатель ofstream в родительском классе Sensor.

Я действительно не понимаю, почему он должен быть виртуальным, если он всегда один и тот же.

1 голос
/ 06 июня 2010

storeSensor должен быть объявлен виртуальным в Sensor (и любом другом классе, который может быть унаследован). Это убедится, что звонок

Sensors[i]->storeSensor(os);

подберет правильный метод.

Вам нужно только повторно объявить storeSensor в любом классе, реализация которого отличается от базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...