【问题标题】:Declaring a variable for an object I made in C++为我在 C++ 中创建的对象声明一个变量
【发布时间】:2012-03-01 13:22:23
【问题描述】:

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

【问题讨论】:

  • 也许你应该从这个问题中删除你的 java 标签,因为它与 Java 无关。
  • @HovercraftFullOfEels:他也应该去掉[java]的心态。
  • 值得注意的是,在 C++ 中,构造函数的工作方式与 Java 不同。在 Java 中,语法是 always Thing a = new Thing();,但在 C++ 中,只有当您想在堆上创建对象时才使用该语法。如果你想构造一个实际的对象,你应该将它创建为Thing a;,或者带参数,Thing a(1, 2, "red", "blue");

标签: c++ object constructor declaration


【解决方案1】:
HeatingUnit heatingUnit;

应该是:

HeatingUnit *heatingUnit;
            ^^

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

如果创建指针不是您的意图(我不确定,因为您是从没有指针的 java 迁移),只需使用:

   HeatingUnit heatingUnit;

但不要在构造函数中使用`new来分配内存。

【讨论】:

    【解决方案2】:

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

    HeatingUnit* heatingUnit;
    

    然而,你真正想要的是从成员初始化器列表中初始化对象:

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

    【讨论】:

    • 甜蜜! C++中的下划线是做什么的(“tempToMaintain_”)
    • 好吧,我只是附上了下划线以确保名称不会冲突。这不是真的必要,但我不得不承认我不确定,但只是与坐在我旁边的语言专家(理查德科登)确认第一个名称是指成员,第二个是参数列表中的名称,如果他们是相同的(即您可以安全地删除下划线)。
    【解决方案3】:

    变量声明应该是,

    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 等. 运算符一起使用,而不是-&gt;

    除此之外,在 C++ 中,只有当你想动态地执行它时,你才应该使用 new。在您的具体情况下,HeatingUnit heatingUnit; 就足够了,它声明了一个自动对象并且不需要手动进行任何解除分配。

    【讨论】:

      【解决方案4】:

      如果你想做:

      heatingUnit= new HeatingUnit(isOn, initialTemp);
      

      你必须改变

      HeatingUnit heatingUnit
      

      HeatingUnit *heatingUnit
      

      为什么?因为在 Java 中,所有对象默认只能保存对对象的 references,而在 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)
      { }
      

      【讨论】:

      • 当我使用您的技术时,我得到“BangBangControl.cpp:18:错误:成员初始化表达式列表被视为复合表达式 BangBangControl.cpp:18:错误:从 'int' 到 'HeatingUnit* 的无效转换’”。为什么会这样?
      • @user937897:当使用第一个版本时(使用new),用星号声明HeatingUnit *heatingUnit,当使用第二个版本(不带new)时,声明Heating heatingUnit不带星号
      • 甜蜜。你的解释很透彻,很有帮助
      猜你喜欢
      • 2017-04-10
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2012-10-15
      相关资源
      最近更新 更多