按值删除向量中的元素

时间:2015-11-18 09:59:37

标签: c++ inheritance vector stl polymorphism

如何从Flight中检索一个对象以与主要的输入(flightNumber)进行比较?如何在main中声明属性类型?

编译时,会显示一条错误消息:invalid conversion of 'int' to '*Flight*' agent1.delete(flightNumber);

class Flight
{
    int FlightNumber 
};

class TravelAgent
{
    vector <Flight *> flightList;
};

void Agent::delete(Flight *obj)
{
    vector<Flight*>::iterator ptr;
    for(ptr=flightList.begin();ptr!=flightList.end();ptr++)
    {
        if((*Ptr)==obj)
        {
            flightList.erase(ptr);
            break;
        }
    }
    if ((ptr) == flightList.end())
    {
        cout<<"Flight not found"<<endl;
    }
}

int main
{
      Agent agent1;
      int flightNumber;
      cout<<"Enter the number of the flight: "<<flush;
      in>>flightNumber;
      agent1.delete(flightNumber); 
}

3 个答案:

答案 0 :(得分:1)

您可以在Flight类

中添加(如果不存在)getter
class Flight{
int FlightNumber;

public:

int getflightNumber(){ return flightNumber;}
};

并按以下步骤操作: -

void Agent::delete(int flightNumber)
{
    vector<Flight*>::iterator ptr;
    for(ptr=flightList.begin();ptr!=flightList.end();ptr++)
    {
        if(((*Ptr)->getflightNumber() == flightNumber)
        {
            flightList.erase(ptr);
            break;
        }
    }
    if ((fPtr) == listFlight.end())
    {
        cout<<"Flight not found"<<endl;
    }
}

答案 1 :(得分:1)

由于此处的代码不能完全发挥作用,因此很难给出好的建议。

首先,您的错误发生是因为您使用void Agent::delete(Flight *obj)类型的变量而不是类型int调用(似乎是)成员函数Flight。编译器无法将Flight对象解释为int,因此会抛出错误。

其次,您想知道如何从对象中检索属性。我会建议您查看访问者 mutators

如果要检索Flight对象中的信息保留,则应该公开允许的成员函数。

// in your header file
class Flight
{
private:
    int flight_number;

public:
    // retrieve flight number value
    int get_flight_number(void) const;
    // allow to set the flight number value
    void set_flight_number(int new_flight_number);
    // some other member functions
}

// in your source file
int Flight::get_flight_number(void) const
{
   return this->flight_number;
}

void Flight::set_flight_number(int new_flight_number)
{
    // let's do some verification (do whatever you want)
    if (new_flight_number > 0)
    {
         this->flight_number = new_flight_number;
    }
}

通过这种方式,您可以通过编写来设置和访问flight_number,例如:

void test_function(Flight *f)
{
    if (f->get_flight_number() == 42)
    {
        // do some stuff
    }
}

int main()
{
    Flight *my_f = new Flight();
    my_f->set_flight_number = 4242;
    my_test_function(my_f);
}

现在,您有足够的信息可以开始。

注意:

你大量使用指针。现代C ++强烈倾向于!尝试使用引用或移动操作。您可以参考此页面获取信息:

虽然这对初学者来说有点硬核。网上到处都是精彩的文章。关于它

答案 2 :(得分:0)

您的主要方法中存在原始错误。您需要对其进行更改,以便创建delete类的实例,而不是将航班号传递到Flight方法。

int main() { // you are also missing parenthesis
      Agent agent1;
      int flightNumber;
      cout<<"Enter the number of the flight: "<<flush; // I don't know what flush is but maybe you meant std::endl
      cin>>flightNumber;
      Flight flight(flightNumber);
      agent1.delete(&flight); // delete takes a Flight* not an int
}

这要求您的Flight类具有适当的构造函数。

class Flight
{
public:
    Flight(int flightNumber)
        : flightNumber_(flightNumber)
    {}

private:
    int flightNumber_;
};

然后在您的delete方法中,在向量中搜索Flight实例,该实例与您要从向量中移除的flightNumber_具有相同的Flight。这将要求您的Flight课程有一些方法可以返回flightNumber_成员变量。

这绝对不是最好的方法,并且远不符合现代C ++标准,但它应该让你去。