首页 > 解决方案 > 如何对指向具有多个条件的类的不同实例的指针向量进行排序?

问题描述

我需要用这个测试数据对一个指针向量进行排序。

主文件

#include "cart.h"

int main()
{
    Cart cart;

    cart.addItem("Desktop", 125.34f);
    cart.addItem("Iphone", 46.274f);
    cart.addItem("Pen", 118.99f);
    cart.addItem("Ruler", 41.34f);
    cart.addItem("Printer", 2.99f);

    cart.printSortedItems();

    cart.destroy();
}

项目.h

#include <string>
#include <tuple>

class Item
{
private: 
    Item(const std::string& name, const ItemType& itemType, const float& price);
    ~Item();
    std::string m_name;
    float m_price;

public:
    static Item *getInstance(const std::string& name, const float& price);
    bool operator>(const Item& item2) const;
    void print() const;
};

项目.cpp

#include "item.h"
#include <iostream>

Item::Item(const std::string& name, const float& price)
{
    m_name = name;
    m_price = price;
}

Item::~Item()
{
}

Item *Item::getInstance(const std::string& name, const float& price)
{
    return new Item(name, price);
}

bool Item::operator>(const Item & item2) const
{
    if (m_name > item2.m_name) {
        return true;
    }
    if (m_name == item2.m_name && m_price > item2.m_price) {
        return true;
    }

    return false;
}

void Item::print() const
{
    std::cout << "Item name: " << m_name << " Item price: "<< m_price << std::endl;
}

购物车.h

#include <vector>

class Cart
{
public:
    Cart();
    ~Cart();

    void addItem(const std::string& name, const float& price);
    void printSortedItems();
    void sortItems();
    void destroy();

private:
    std::vector<Item*> m_itemList = {};
};

购物车.cpp

#include "cart.h"
#include <iostream>
#include <algorithm>

Cart::Cart(){}
Cart::~Cart(){}

void Cart::addItem(const std::string& name, const float& price)
{
    Item *newItem = Item::getInstance(name, itemType, price);
    m_itemList.push_back(newItem);  
}

void Cart::sortItems()
{
    for (size_t i = 0; i < m_itemList.size()-1; i++)
    {
        for (size_t j = i + 1; j < m_itemList.size(); j++)
        {
            if (m_itemList[i] > m_itemList[j])
            {
                std::swap(m_itemList[i], m_itemList[j]);
            }
        }
    }
}

void Cart::printSortedItems()
{
    sortItems();
    std::cout << "Items" << std::endl;

    for (size_t i = 0; i < m_itemList.size(); i++)
    {
        m_itemList[i]->print();
    }

    std::cout << std::endl;
}

void Cart::destroy()
{
    for (size_t i = 0; i < m_itemList.size(); i++)
    {
        delete m_itemList[i];
        m_itemList[i] = nullptr;
    }
}

在函数Cart::sortItems()中,我比较m_itemList[i]m_itemList[j],它们都是指向实例的指针Item。理论上,如果我在 中设置一个断点bool Item::operator>(const Item & item2) const,它应该被击中。但是在这种情况下,没有命中断点,因此排序后的结果是错误的。你们能告诉我我哪里错了吗?

标签: c++sortingoop

解决方案


推荐阅读