我正在尝试对其中有价格的汽车数组进行排序,我似乎在排序数组时遇到问题,该数组是指向另一个类的指针。我得到"错误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;
};
答案 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);
其他强> 虽然这将解决您在错误消息上的当前问题,但您仍需要修改排序算法。
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);
}
只需将此功能替换为您的排序功能,它应该按照价格递增的顺序对汽车进行排序。
希望有所帮助!