C ++无法将'type'转换为'type *'

时间:2013-11-21 10:30:15

标签: c++ types

在我的代码error: cannot convert 'Aircrafts' to 'Aircrafts*'

中收到此错误

我要做的就是将一个类记录添加到一个向量中。

它是一个c ++代码并使用-ansi -Wall -pedantic

这有点让我烦恼。希望有人可以提供帮助。这是我的代码:

此行temp_aircraft = Aircrafts("Scenic", "Piper Arrow", 3, 120, 0, 0);

给出了

错误

#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>
#include <iomanip>

using namespace std;

class Aircrafts
{
   public:
      string category;
      string aircraft;

   public: 

      Aircrafts () { 
         category = "";
         aircraft = "";         
      }

      Aircrafts (string f_cat, string airc) {
         category = f_cat;
         aircraft = airc;
      }      
}

void main()
{

   vector <Aircrafts> aircraft_list;

   Aircrafts *temp_aircraft;

   temp_aircraft = new Aircrafts;
   temp_aircraft = Aircrafts("Abc", "Xyz");
   aircraft_list.push_back(*temp_aircraft);
}

9 个答案:

答案 0 :(得分:3)

要修复间接级别的错误,可以替换

temp_aircraft = new Aircrafts;
temp_aircraft = Aircrafts("Abc", "Xyz");

temp_aircraft = new Aircrafts("Abc", "Xyz");

这是使用参数调用构造函数的正确语法。但是,这会造成内存泄漏。

你根本不需要new - 你可以在不使用temp_aircraft指针的情况下在一行上完成所有事情:

aircraft_list.push_back(Aircrafts("Abc", "Xyz"));

答案 1 :(得分:1)

您将Aircrafts对象分配到指向Aircrafts的指针。这不起作用。

查看代码,您根本不需要任何动态分配(= new)。就这样做:

void main()
{

   vector <Aircrafts> aircraft_list;

   aircraft_list.push_back(Aircrafts("Abc", "Xyz"));
}

答案 2 :(得分:1)

不需要指针

Aircrafts temp_aircraft("Abc", "Xyz");
aircraft_list.push_back(temp_aircraft);

为什么初学者喜欢指针?

编辑我休息我的情况,OP选择了继续使用指针的答案,尽管其他每个答案都告诉他们指针是不必要的。

答案 3 :(得分:1)

首先,您将temp_aircraft声明为指向Aircrafts的指针,然后使用new正确初始化。但是,然后尝试将非指针对象分配给指针。

此处不需要指针,只需创建对象并一次性将其推入容器中:

aircraft_list.push_back(Aircrafts("Abc", "Xyz"));

即使您没有定义显式的复制赋值运算符(编译器也会为您创建一个简单的),这将适用于您的类。但是你可能想要了解the rule of three

答案 4 :(得分:1)

这行代码,

temp_aircraft = Aircrafts("Abc", "Xyz");

应该是

temp_aircraft = new Aircrafts("Abc", "Xyz");

请记住在课程结束时加入分号。

class Aircrafts
{
   .....
}; // <-- semicolon here

答案 5 :(得分:1)

而不是

temp_aircraft = new Aircrafts;
temp_aircraft = Aircrafts("Abc", "Xyz");

你应该这样做:

temp_aircraft = new Aircrafts("Abc", "Xyz");

构造函数Aircrafts()为您提供飞机对象,同时temp_aircraft为Aircrafts *


P.S。你也有内存泄漏问题。您使用new分配的所有内容,当您不再需要时,必须使用delete免费; 你可以这样做:

   Aircrafts *temp_aircraft;

   temp_aircraft = new Aircrafts;
   temp_aircraft = Aircrafts("Abc", "Xyz");
   aircraft_list.push_back(*temp_aircraft);
   delete temp_aircraft;

或者可能根本不需要指针。您可以通过一行获得相同的结果:

   aircraft_list.push_back( Aircrafts("Abc", "Xyz") );

答案 6 :(得分:1)

不需要临时对象。

int main()
{
   vector <Aircrafts> aircraft_list;
   aircraft_list.emplace_back("Abc", "Xyz");
}

答案 7 :(得分:0)

temp_aircraft是一个指针,所以当你尝试

temp_aircraft = Aircrafts("Scenic", "Piper Arrow", 3, 120, 0, 0);

您正尝试使用赋值运算符将飞机分配到temp_aircarft

当你说新的时,你可以使用这个构造函数:

   temp_aircraft = new Aircrafts("Abc", "Xyz");

(或者不管是什么线都会产生错误)

当然,当你做的时候

aircraft_list.push_back(*temp_aircraft);

你将忘记删除指针。正如其他答案所说,你可以(并且应该)在没有指针的情况下这样做。

答案 8 :(得分:0)

问题出现在这一行:temp_aircraft = Aircrafts("Abc", "Xyz");

当您编写Aircrafts("Abc", "Xyz")时,您创建了飞机类的对象,并尝试将其影响到Aircrafts *类型的变量(指向飞机的指针)。如果要创建指针,请使用运算符new,如下所示:

temp_aircraft = new Aircrafts("Abc", "Xyz");

如果您不想要指针,请使用Aircraft类型创建变量,如下所示:

Aircrafts temp_aircraft;

在这里,你混合了两种方式,这就是为什么它不起作用。