2015-04-06 2 views
2

Я пытаюсь сортировать массив автомобилей, у которых в них есть цены. Кажется, у меня проблема с сортировкой массива, который является указателем на другой класс. Я получаю «ошибка C2106: '=': левый операнд должен быть l-value», когда я пытаюсь изменить порядок массива.C++ Сортировка массива, который является указателем на класс

Приведенный ниже код.

Моя сортировка функция.

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

Вам нужно поменять местами сами автомобили, а не значения. "ptrToPool [i] = ptrToPool [i + 1];" и т. д. Кроме того, я бы настоятельно рекомендовал использовать более стандартные библиотечные функции. В частности, std :: sort выполнил бы большую часть работы для вас. Вы также можете использовать std :: swap для свопа. Вы также можете использовать std :: vector вместо массива. Когда вы используете стандартные библиотечные функции, ваш код имеет тенденцию быть более простым, быстрым и более безаварийным. – Lalaland

ответ

0

getPrice() в определенном для возвращения доу BLE:

double Car::getPrice() 

Теперь, в приведенных ниже утверждений вы получаете ERROR C2106, так как вы пытаетесь сделать присвоения номера (по сравнению с переменная):

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

Попробуйте использовать std::swap (на объектах автомобиля), где вы получите ошибку (вам нужно move назначение и конструктор должно быть определено).

Стандартная библиотека реализовала его для вас - теперь используйте его.

PS: Вы получаете ошибку, потому что ваша функция getter возвращает значение, а не ссылку (к которой вы можете назначить значение).

Если вы не хотите использовать стандартную библиотеку, вы можете позволить методу getter вернуть ссылку, или вы можете использовать функцию setter в левой части =.

0

Задача: Учитывая реализацию класса, вы не можете установить цену, используя getPrice(), поскольку это просто геттер, а не сеттер. Поэтому линии:

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. Вы хотите отсортировать подержанные автомобили или просто цены? FYI: обмен цен не повлияет на другие данные!
  2. Какой алгоритм сортировки вы пытаетесь реализовать? Сортировка сортировки или сортировка сортировки? Напомним, что они O (nxn). Вы можете использовать сортировку библиотеки (т. Е. Std :: sort), которая является «быстрой сортировкой» и имеет сложность времени O (nxlogn) намного быстрее для больших данных. Вы можете обратиться к:

http://www.cplusplus.com/reference/algorithm/sort/?kw=sort

EDIT ON СОРТИРОВКА:

Для сортировки вагонов в порядке возрастания цен вы можете сделать следующее:

Во-первых, включают в себя следующее для использования библиотеки сортировка:

#include <algorithm> 

Во-вторых, добавьте меньше, чем (<) перегрузку оператора к классу вашего автомобиля по цене. (Edit:.. Как 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; 
}; 

Наконец в функции сортировки только по телефону:

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

Поэтому ваша последняя функция сортировки будет следующим (да что коротка!):

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

Jus t замените эту функцию функцией сортировки, и она должна сортировать автомобили по их цене в порядке возрастания.

Надеюсь, что это поможет!

+0

Спасибо, очень хорошее объяснение. – BeginnerLK

+0

Я до сих пор не знаю, как бы я сортировал машины, а не только цены. Должен ли я создавать метод setter для всех членов данных[email protected] yeniaras – BeginnerLK

+0

@BeginnerLK: Потому что ваш вопрос был «сортировать массив автомобилей, в которых есть цены». Поэтому я предполагаю, что вы хотите сортировать автомобили по их ценам. Не так ли? –

Смежные вопросы