Объявление переменной для объекта, который я сделал в C ++ - PullRequest
0 голосов
/ 09 февраля 2012

Я парень по Java и пытаюсь выполнить задание с C ++ для класса.У меня проблемы с объявлением переменной типа, которую я создал, как свойство другого класса.Это мой подход

  private:
    HeatingUnit heatingUnit;
    int tempToMaintain;

  public:
    BangBangControl(int tempToMaintain, bool isOn, int initialTemp){
      heatingUnit= new HeatingUnit(isOn, initialTemp);
      this -> tempToMaintain = tempToMaintain;
    }

Я получаю эту ошибку

BangBangControl.cpp: In constructor ‘BangBangControl::BangBangControl(int, bool, int)’:
BangBangControl.cpp:15: error: no match for ‘operator=’ in ‘((BangBangControl*)this)->BangBangControl::heatingUnit = (((HeatingUnit*)operator new(8u)), (<anonymous>->HeatingUnit::HeatingUnit(((int)isOn), initialTemp), <anonymous>))’
HeatingUnit.h:6: note: candidates are: HeatingUnit& HeatingUnit::operator=(const HeatingUnit&)
BangBangControl.cpp: In member function ‘int BangBangControl::main()’:
BangBangControl.cpp:37: error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)), ((const char*)"Temp to maintain is: ")))->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](bBC. BangBangControl::getTemp()))), ((const char*)" Current temp is: ")) << bBC. BangBangControl::update()’
/usr/include/c++/4.2.1/ostream:112: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:121: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:131: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:169: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:177: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/bits/ostream.tcc:92: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:184: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/bits/ostream.tcc:106: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:195: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:204: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:208: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:213: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:217: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:225: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/ostream:229: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/bits/ostream.tcc:120: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012
HeatingUnit heatingUnit;

должно быть:

HeatingUnit *heatingUnit;
            ^^

Я считаю, что вы намерены создать указатель типа HeatingUnit, поскольку вы используете new внутри конструктора.new используется для выделения памяти в свободном хранилище переменным указателя.

Если создание указателя не является вашим намерением (я не уверен, поскольку вы переходите с Java, у которого нет указателей), просто используйте:

   HeatingUnit heatingUnit;

, но не используйте `Новое для выделения памяти в конструкторе.

2 голосов
/ 09 февраля 2012

В C ++ объекты создаются без new, если вы не хотите помещать их в кучу.Чтобы поместить их в кучу, вам нужно использовать указатель, например,

HeatingUnit* heatingUnit;

Однако, на самом деле вам нужно инициализировать объект из списка инициализатора элемента:

BangBangControl(int tempToMaintain_, bool isOn, int initialTemp):
    heatingUnit(isOn, initialTemp),
    tempToMaintain(tempToMaintain_)
{
}
0 голосов
/ 09 февраля 2012

Если вы хотите сделать:

heatingUnit= new HeatingUnit(isOn, initialTemp);

Вы должны изменить

HeatingUnit heatingUnit

до

HeatingUnit *heatingUnit

Почему? Потому что в Java все объекты могут содержать только ссылки на объекты по умолчанию, и для этого в C ++ вы должны объявить его как указатель, тогда как в C ++ объекты могут иметь подобъекты в качестве полей ( в Java).

Кроме того, хотя в Java инициализация выполняется в теле конструктора, в C ++ рекомендуется использовать списки инициализации.

BangBangControl(int tempToMaintain, bool isOn, int initialTemp)
: heatingUnit(new HeatingUnit(isOn, initialTemp)),
  tempToMaintain(tempToMaintain)
{ }

Однако использование new требует, чтобы вам пришлось самостоятельно очищать память, используя delete, поэтому, вероятно, было бы предпочтительным следующее:

BangBangControl(int tempToMaintain, bool isOn, int initialTemp)
: heatingUnit(isOn, initialTemp),
  tempToMaintain(tempToMaintain)
{ }
0 голосов
/ 09 февраля 2012

Объявление переменной должно быть,

HeatingUnit *heatingUnit;

new HeatingUnit возвращает указатель HeatingUnit* и для удержания необходим указатель.

Для вашего сведения, здесь есть еще один способ (который имеет свои ограничения, но вы чувствуете себя как Java):

  private:
    HeatingUnit &heatingUnit;  // <--- declare reference
    int tempToMaintain;

  public:
    BangBangControl(int tempToMaintain, bool isOn, int initialTemp) :
    heatingUnit(*new HeatingUnit(isOn, initialTemp))
    {
      this -> tempToMaintain = tempToMaintain;
    }

Обратите внимание, что мы определяем heatingUnit в списке инициализатора конструктора. Вы можете сделать это и для tempMaintain.

Теперь heatingUnit можно использовать с оператором ., таким как Java, вместо ->.

Все это отдельно, в C ++ вы должны использовать new, только если вы хотите сделать это динамически. В вашем конкретном случае достаточно HeatingUnit heatingUnit;, который объявляет автоматический объект и не требует никакого освобождения вручную.

...