簡體   English   中英

為我用C ++制作的對象聲明一個變量

[英]Declaring a variable for an object I made in C++

我是一名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>]
HeatingUnit heatingUnit;

應該:

HeatingUnit *heatingUnit;
            ^^

我相信您的意圖是創建一個HeatingUnit類型的指針,因為您在構造函數中使用了new new用於在免費存儲中為指針變量分配內存。

如果創建指針不是您的意圖(我不確定,因為您是從沒有指針的java遷移),只需使用:

   HeatingUnit heatingUnit;

但不要使用`new在構造函數中分配內存。

在C ++中,除非您想將它們放到堆上,否則創建的對象沒有new對象。 要將它們放在堆上,您需要使用一個指針,例如

HeatingUnit* heatingUnit;

但是,您真正想要的是從成員初始化器列表中初始化對象:

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

變量聲明應為

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才應使用new 在您的特定情況下, HeatingUnit heatingUnit; 就足夠了,它聲明了一個自動對象,不需要手動進行任何釋放。

如果您想這樣做:

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)
{ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM