Why am I getting the "Expression is not assignable" error?

30,455

In C++ int is a primitive type, not a class, like in Java. If you return int, you just return it as a constant, so

gL[i].get_sold(i) = something;

is not possible. You need to have proper getter and setter for your class:

int Item::get_sold() {
    return sold;
}
void Item::set_sold(int s) {
    sold= s;
}

//..

if(gL[i].get_sold() > gL[smallestPos].get_sold()) {

    temp = gL[i].get_sold();
    gL[i].set_sold(gL[smallestPos].get_sold()); 
    gL[smallestPos].set_sold(temp);      
}

also, consider to use std::vector template and sort function:

http://www.cplusplus.com/reference/algorithm/sort/

#include <algorithm>
#include <vector>

// Create comparsion function (or simple overload an < operator):
bool compareSold(Item i1, Item i2) {
    return i1.get_sold() < i2.get_sold();
}    

// replace static array with std::vector<Item>
std::vector<Item> arrItems();

// You can init it with your static array, but better way would be
// to delete a static array and use this vector all the time.
arrItems.assign(gL, gL+ct); 

// Sort it
std::sort (arrItems.begin(), arrItens.end(), compareSold);

// If you need to convert std::vector to [] array, you can use &arrItems.front()
Item* i = &arrItems[0];
Share:
30,455
Sam Perales
Author by

Sam Perales

Computer Science major living with cat roommates, what more can you ask for.

Updated on July 09, 2022

Comments

  • Sam Perales
    Sam Perales almost 2 years

    I made a class with private name, units sold, and units remaining.

    I made two class methods that return, units sold and units remaining as ints.

    I want to sort the units sold from greatest to least, but I get errors as I explain in the comments.

    What am I doing wrong, is it something very obvious?

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    const int MAX_SIZE = 1000;
    const char FILE_NAME[14] = "inventory.txt";
    
    //make an Item class
    class Item
    {
    private:
        string name;
        int sold, remain;
    public:
        void set_name(string _name);
        void set_sold(int _sold);
        int get_sold(int);
        void set_remain(int _remain);
        int get_remain(int);
        void print();
    };
    
    //I erased all the methods setting name, sold, and remaining, they work though
    
    int Item::get_sold(int s)
    {
        s = sold;
    
        return s;
    }
    int Item::get_remain(int r)
    {
        r = remain;
    
        return r;
    }
    
    //greatest to least units sold
    void sort_sold(Item gL[], int ct) // ct is a global constant set to 1000
    {
        //local variables
        int smallestPos;
        int temp;
    
        //for every position in the array
        for(int i=0;i<ct;i++)
        {
            //find the smallest element starting at that point
            smallestPos = i;
            for(int j=i+1;j<ct;j++)
            {
                if(gL[j].get_sold(j) < gL[smallestPos].get_sold(smallestPos))
                {
                    //found a smaller one, remember and keep going
                    smallestPos = j;
                }
            }
            //see if we found something smaller than gL[i].get_sold(i)
            if(gL[i].get_sold(i) > gL[smallestPos].get_sold(smallestPos))
            {
                //we did find a smaller one, so swap with gL[i].get_sold(i)
                temp = gL[i].get_sold(i);
                gL[i].get_sold(i) = gL[smallestPos].get_sold(smallestPos); //not assignable?
                gL[smallestPos].get_sold(smallestPos) = temp;              //not assignable?
            }
        }
    
    }