C ++排序数组,它是指向类的指针

时间:2015-04-06 21:35:06

标签: c++ arrays class sorting pointers

我正在尝试对其中有价格的汽车数组进行排序,我似乎在排序数组时遇到问题,该数组是指向另一个类的指针。我得到"错误C2106:' =' :左操作数必须是l值"当我尝试更改数组的顺序时。

我已附上以下代码。

我的排序功能。

void CarPool::Sort()
{
    const int MAXVAL = 9;
    int coun = countCars;
    double temp;
    bool swappedFlag = true;

    while (swappedFlag)
    {
        swappedFlag = false;
        for (int i = 0; i < countCars - 1; i++)
        {
            ptrToPool[i].getPrice();
            if (ptrToPool[i].getPrice()> ptrToPool[i + 1].getPrice())
            {
                temp = ptrToPool[i].getPrice();
                ptrToPool[i].getPrice() = ptrToPool[i + 1].getPrice(); //ERROR C2106
                ptrToPool[i + 1].getPrice() = temp; //ERROR C2106
                swappedFlag = true;
            }
        }
    }
}

car.cpp

#pragma once
#include "car.h"  // put the related header at the TOP of the list of   includes
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

Car::Car(string mName, string reg, double eng, double pri)
{
    // store the parameter values for this object private data
     ModelName = mName;
     Registration = reg;
     EngineSize = eng;
     Price = pri;
}

Car::Car()
{
// set up a value that shows the data not properly loaded
    ModelName = "Unspecified";
}

void Car::Load(ifstream& carFile)
{
    carFile>>ModelName>>Registration>>EngineSize>>Price;

}


void Car::Display()
{
    cout<<setfill(' ')<<setw(10)<<ModelName<<setfill(' ')<<setw(10)<<Registration;
    cout<<setfill(' ')<<setw(10)<<EngineSize<<setfill(' ')<<setw(10)<<Price<<endl;
}

double Car::Ratio() //how much it costs per cc of engine!
{
    return EngineSize/Price;
}

string Car::getRegistration()
{
    return Registration;
}

double Car::getPrice()
{
    return Price;
}

carpool.cpp(也是第一段代码中列出的函数)

#include "carpool.h"

#include <iostream>
#include <fstream>

using namespace std;

CarPool::CarPool()
{
    countCars=0; //for now
    name = "None";
}

CarPool::~CarPool()
{
    if (countCars>0)
    {
        delete [] ptrToPool;
    }
}

int CarPool::Load(string fromFilename)
{
    // assumes file starts with count of cars
    ifstream inFile(fromFilename);
    if (!inFile)
    {
        return -1; //oh dear no file to read
    }
    inFile>>countCars; //read the following number of cars
    ptrToPool = new Car[countCars];
    for (int i=0; i<countCars; i++)
    {
        ptrToPool[i].Load(inFile);
    }
    return 0; //successful!
}

car.h

#pragma once
#include <string>
using namespace std;

class Car
{
public:
    // see later for the bodies of the functions!
    Car(string mName, string reg, double eng, double pri);
    Car();
    void Load(ifstream& carFile);
    void Save(ofstream& carFile);
    void Display();
    string getRegistration();
    double getPrice();
    double Ratio(); //how much it costs per cc of engine!
    void setPrice(double pri);

private:
    string ModelName;
    string Registration;
    double EngineSize;
    double Price;
};

3 个答案:

答案 0 :(得分:0)

getPrice()定义为返回double:

double Car::getPrice()

现在,在以下语句中,您将获得ERROR C2106,因为您尝试将赋值作为数字(对比变量):

ptrToPool[i].getPrice() = ptrToPool[i + 1].getPrice(); //ERROR C2106
ptrToPool[i + 1].getPrice() = temp; //ERROR C2106

答案 1 :(得分:0)

尝试使用std::swap(在汽车对象上)获得错误(您需要定义move赋值和构造函数。)

标准库为您实现了它 - 现在去使用它。

PS:您收到错误是因为您的getter函数返回的值而不是引用(您可以为其指定值)。

如果您不想使用标准库,可以让getter方法返回引用,或者您可以使用=左侧的setter函数。

答案 2 :(得分:0)

<强>问题: 鉴于类实现,您无法使用getPrice()设置价格,因为它只是一个getter而不是setter。因此行:

ptrToPool[i].getPrice() = ptrToPool[i + 1].getPrice(); //ERROR C2106
ptrToPool[i + 1].getPrice() = temp; //ERROR C2106
预计

会给出等式左边的误差。

<强>解决方案: 你需要一个二传手。类似的东西:

ptrToPool[i].setPrice(someValue);

示例实施: 尝试将以下方法添加到您的班级:

void Car::setPrice(double pri)
{
    Price=pri;
}

然后调用此方法更新价格,如下所示(用这两行代替):

ptrToPool[i].setPrice(ptrToPool[i + 1].getPrice());
ptrToPool[i + 1].getPrice(temp); 

其他 虽然这将解决您在错误消息上的当前问题,但您仍需要修改排序算法。

  1. 你想要分类汽车还是只是价格?仅供参考:交换价格不会影响其他数据!
  2. 您尝试实施哪种排序算法?插入排序或选择排序?请记住它们是O(nxn)。您可以使用“快速排序”的库排序(即std :: sort),并且对于大数据,O(nxlogn)时间复杂度要快得多。您可以参考:
  3. http://www.cplusplus.com/reference/algorithm/sort/?kw=sort

    编辑分类:

    按照价格递增的顺序对汽车进行分类,您可以执行以下操作:

    首先,使用库排序包含以下内容:

    #include <algorithm>
    

    其次,根据价格为您的汽车类添加小于(&lt;)的运算符重载。 (编辑:当n0rd建议而不是运算符重载时,您可以为更通用的方法定义自定义比较器。有一个示例如何在上面的链接中。) 最后一堂课看起来像:

    class Car
    {
    public:
        // see later for the bodies of the functions!
        Car(string mName, string reg, double eng, double pri);
        Car();
        void Load(ifstream& carFile);
        void Save(ofstream& carFile);
        void Display();
        string getRegistration();
        double getPrice();
        double Ratio(); //how much it costs per cc of engine!
        void setPrice(double pri);
        bool operator < (const Car& car) const
        {
            return (Price < car.Price);
        }
    
    private:
        string ModelName;
        string Registration;
        double EngineSize;
        double Price;
    };
    

    最后在你的sort函数中调用:

    std::sort(ptrToPool, ptrToPool + size);
    

    因此,您的最终排序功能如下(是的,简短!):

    void CarPool::Sort()
    {
        std::sort(ptrToPool, ptrToPool + countCars);
    }
    

    只需将此功能替换为您的排序功能,它应该按照价格递增的顺序对汽车进行排序。

    希望有所帮助!