2012-02-09 69 views
0

我是一个Java人,我正在尝试使用C++为一个类进行任务。我无法声明作为另一个类的属性创建的类型的变量。这是我的方法为我在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>] 
+0

也许你应该从这个问题进行删除您'java'标签它与Java无关。 – 2012-02-09 02:36:49

+3

@HovercraftFullOfEels:他也应该删除他的'[java]'心态。 – Xeo 2012-02-09 02:42:50

+0

值得注意的是,在C++中,构造函数与Java不一样。在Java中,语法是_always_'Thing a = new Thing();',但在C++中,只有当您想在堆上创建对象时,该语法才是。如果你想构建一个实际的对象,你应该将它创建为'Thing a;'或者带参数'Thing a(1,2,“red”,“blue”);'。 – 2016-05-05 16:56:51

回答

4
HeatingUnit heatingUnit; 

应该是:

HeatingUnit *heatingUnit; 
      ^^ 

我相信你的意图是,因为你创建的类型HeatingUnit的指针在构造函数中使用newnew用于将空闲存储上的内存分配给指针变量。

如果创建一个指针是不是你的意图(我不知道,因为你是从没有指针的Java迁移),只需使用:

HeatingUnit heatingUnit; 

但不要用'新来分配内存中的构造函数。

0

变量声明应该是,

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;就足够了,它声明了一个自动对象,并且不需要任何手动解除分配。

+0

谢谢!这是非常丰富的。 – 2012-02-09 03:13:10

2

在C++对象中创建时没有new,除非你想把它们放在堆上。要把它们放在堆上,你需要使用一个指针,例如

HeatingUnit* heatingUnit; 

但是,你真正想要的是从成员初始化列表初始化对象:

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

sweeet! C++中的下划线是什么(“tempToMaintain_”) – 2012-02-09 03:03:17

+0

嗯,我只是附加下划线以确保名称不冲突。这并不是必要的,但我不得不承认,我不确定,但只是坐在我旁边的一位语言专家(理查德科登)证实,名字指的是成员,而第二名来自参数列表中的名称,如果他们是一样的(即你可以安全地删除下划线)。 – 2012-02-09 05:28:28

0

如果你想做的事:

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

当我使用你的技术我得到“BangBangControl.cpp:18:错误:成员初始化表达式列表视为复合表达式 BangBangControl.cpp:18:错误:从'int'无效转换为'HeatingUnit *'”。这是为什么发生? – 2012-02-09 03:35:38

+0

@ user937897:当使用第一个版本(使用'new')时,使用第二个版本(不带'new')声明'HeatingUnit * heatingUnit'带星号,声明'Heating heatingUnit'没有星号 – 2012-02-09 03:39:51

+0

甜。你的解释是彻底的,非常有帮助 – 2012-02-09 03:48:50