Проблемы конструктора делегирования класса C ++ - PullRequest
0 голосов
/ 23 декабря 2009

Спасибо за чтение. Класс делегирования называется Sensor. Требуется установить ссылку в конструкторе, например:

class Sensor { Sensor(other *ref);}

У меня есть класс testFactory. Если я сейчас наберу

class testFactor{ ...stuff... private: Sensor mySensor;}

Я получаю ВСЕ проблемы. Он не может выделить абстрактный объект. Либо он не может объявить переменную, либо не знает тип переменной.

Даже вывод Sensor из заголовка в cpp в качестве статической переменной не помогает.

Только если я заменил конструктор датчика на конструктор void / non, я не получу НИКАКИХ проблем.

Но тогда мне нужно использовать функцию setRed в датчике, и это может привести к большему количеству проблем.

Надеюсь, вы сможете мне помочь: объявление переменной с классом содержит конструктор без пустот

Ответы [ 5 ]

1 голос
/ 23 декабря 2009

Это прекрасно работает для меня, используя c ++. Возможно, вы не объявили конструкцию Sensor в списке инициализации для Fac?

class Sensor { 
  public:
  Sensor(int *a)
  {
  }
};

int b;

class Fac {
  public:
  Fac():
    sensor(&b)
    {}
  private:
    Sensor sensor;
};

main()
{
  Fac a;
  return 0;
}
1 голос
/ 23 декабря 2009

Вам необходимо правильно инициализировать экземпляр датчика - например:

class TestFactor {
  public:
   TestFactor() : mySensor( 0 ) {}
  private:
   Sensor mySensor;
};
0 голосов
/ 23 декабря 2009

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

Большинство фабричных шаблонов имеют абстрактные базовые классы и указатели возврата базового класса, которые указывают на выделенные производные объекты.

class Sensor
{
  virtual std::string get_sensor_name(void) const = 0;
};

class Fire_Sensor
  : public Sensor
{
  std::string get_sensor_name(void) const
  { return "Fire Sensor";}
};


Sensor *
Sensor_Factory::create_sensor(std::string name)
{
  if (name == "Fire Sensor")
  {
     return new Fire_Sensor;
  }
  return NULL;
}

Также посмотрите ссылка нарезки .

0 голосов
/ 23 декабря 2009

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

Вы можете предоставить открытый конструктор по умолчанию, использовать указатель на экземпляр или просто инициализировать член с помощью открытого конструктора:

class testFactor {
    Sensor mySensor;
public:
    testFactor() : mySensor(0) {}
};
0 голосов
/ 23 декабря 2009

Одна вещь, которую я вижу, это то, что ваш конструктор для Sensor является приватным (попробуйте изменить class на struct или поставить public: перед конструктором или объявить дружбу между Sensor и содержащим класс). И вы должны либо иметь конструктор по умолчанию в дополнение к нему, либо предоставить параметр при создании экземпляра в содержащем классе.

Но вам, очевидно, нужно быть более конкретным, чтобы получить более конкретные ответы.

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