0

I have a vector of Workout objects, and I want to sort it by the prices of the workout (each Workout have const field price and getPrice function) When Im trying to sort the array i get a C2280 error - Workout &Workout::operator =(const Workout &)': attempting to reference a deleted function

#ifndef WORKOUT_H_
#define WORKOUT_H_

#include <string>


class Workout {
public:
    Workout(int w_id, std::string w_name, int w_price, WorkoutType w_type);
    int getPrice() const;
    Workout& operator =(const Workout& other)
        {
            if (this == &other) return *this;
            return *new(this) Workout(other.getId(), other.getName(), 
            other.getPrice(), other.getType());
        }

private:
    const int price;
};

I else have virtual class Customer and cheapCustomer object that inheritence from it, and function- order(const std::vector& workout_options) that needs to sort the vector by the prices.

Here is the Customer cpp file -

#include "Customer.h"
#include <algorithm>
using namespace std;

Customer::Customer(std::string c_name, int c_id) :name(c_name), id(c_id)
{
}

CheapCustomer::CheapCustomer(std::string name, int id) :Customer(name, id)
{
}

std::vector<int> CheapCustomer::order(const std::vector<Workout>& workout_options)

{
    std::vector<int>* v = new std::vector<int>();
    std::vector<Workout> tmp = workout_options;
    std::sort(tmp.begin(), tmp.end(), [](const Workout& w1, const Workout& w2) {
        return w1.getPrice() < w2.getPrice();
        });
    return *v;
    //delete v


}

#include <vector>
#include "Customer.h"
#include "Trainer.h"
#include <algorithm>

using namespace std;
int main(int argc, char** argv) {
   
    Workout w1 = Workout(1, "w1", 10, CARDIO);
    Workout w2 = Workout(2, "w2", 20, CARDIO);
    Workout w3 = Workout(3, "w3", 30, MIXED)
    std::vector<Workout> v;
    v.push_back(w1);
    v.push_back(w2);
    v.push_back(w3);
    
    Customer* c_cheap = new CheapCustomer("Cheap", 20);
    vector<int> order_cheap = c_cheap->order(v);

can some one please tell me how to fix it? Thank you so much

I tried to use unique_ptr and still the same error-

C2280 'std::unique_ptr<Workout,std::default_delete>::unique_ptr(const std::unique_ptr<Workout,std::default_delete> &)': attempting to reference a deleted function

std::vector<int> CheapCustomer::order(const std::vector<Workout>& workout_options)

{
    vector<int>* v = new std::vector<int>();
    vector<unique_ptr<Workout>> v_unique_ptr;
    for (Workout workout : workout_options) {
        v_unique_ptr.push_back(unique_ptr<Workout>(new Workout(workout.getId(),workout.getName(),workout.getPrice(),workout.getType())));
    }
    std::sort(v_unique_ptr.begin(), v_unique_ptr.end(), [](unique_ptr<Workout> w1, unique_ptr<Workout> w2) {
        return w1->getPrice() < w2->getPrice();
        });
}

Edited: its worked here

    vector<int>* v = new std::vector<int>();
    vector<unique_ptr<Workout>> v_unique_ptr;
    for (Workout workout : workout_options) {
        v_unique_ptr.push_back(move(unique_ptr<Workout>(new Workout(workout.getId(),workout.getName(),workout.getPrice(),workout.getType()))));
    }
    std::sort(v_unique_ptr.begin(), v_unique_ptr.end(), [](unique_ptr<Workout>& w1, unique_ptr<Workout>& w2) {
        return w1->getPrice() < w2->getPrice();
        });
    v->push_back(v_unique_ptr[0]->getId());
    return *v;

Thank you so much

Tal Alter
  • 11
  • 3

1 Answers1

0

In order to use std::sort, the element type needs to be move-assignable. Your element type isn't, because of all the const data members.

So you may either:

  1. Remove the const
  2. Provide your own move assignment operator that somehow gets around const
  3. Don't place Workout objects in a container, place pointers instead (preferably smart pointers such as unique_ptr).
n. m. could be an AI
  • 112,515
  • 14
  • 128
  • 243