1,105,177 Community Members

C++ const help

Member Avatar
bennetk2
Newbie Poster
15 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

I can't figure out what this error is saying.

Error:

C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp||In function 'bool operator==(const statistic&, const statistic&)':|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|225|error: passing 'const statistic' as 'this' argument of 'float statistic::sum()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|225|error: passing 'const statistic' as 'this' argument of 'float statistic::sum()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|226|error: passing 'const statistic' as 'this' argument of 'int statistic::length()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|226|error: passing 'const statistic' as 'this' argument of 'int statistic::length()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|227|error: passing 'const statistic' as 'this' argument of 'float statistic::max()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|227|error: passing 'const statistic' as 'this' argument of 'float statistic::max()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|228|error: passing 'const statistic' as 'this' argument of 'float statistic::min()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|228|error: passing 'const statistic' as 'this' argument of 'float statistic::min()' discards qualifiers|
||=== Build finished: 8 errors, 0 warnings ===|

Problem with the code starts in the Bool operator ==, function towards the bottom.

// Kyle Bennett
// CS 372
// Throttle Class

#include <iostream>
#include <cstdlib>
#include <fstream>


using namespace std;

ofstream outfile;

class statistic
{
    public:
        statistic();
        void fresh();
        void next(float);
        int length();
        float max();
        float min();
        float sum();
        float mean();
        float last();
        void display();
        friend statistic operator +(const statistic &stat1, const statistic &stat2);
        friend ostream& operator <<(ostream& output, const statistic& stat2);
    private:
        float avg;
        float high;
        float low;
        float total;
        int amount;
        float end;
};

bool operator ==(statistic const &stat1, statistic const &stat2);
bool operator !=(statistic const &stat1, statistic const &stat2);

int main()
{
    outfile.open("statout.out");  //open outfile
    if (!outfile)                // check outfile
    {
        outfile << "Output file did not open.\n";
        return 1;
    }

    statistic stat1;

    stat1.next(5.5);
    stat1.next(6.6);
    stat1.next(8.8);
    stat1.next(-3.4);
    stat1.next(-0.5);
    stat1.next(4.7);
    stat1.next(9.1);

    stat1.display();

    stat1.next(5.2);
    stat1.next(-3.3);
    stat1.next(-8.5);
    stat1.next(3.2);
    stat1.next(5.5);

    stat1.display();

    outfile << "Starting a new sequence.\n";

    stat1.fresh();

    stat1.display();

    outfile << "Entering into Sequence 1.\n";

    stat1.next(301);
    stat1.next(211);
    stat1.next(981);
    stat1.next(487);
    stat1.next(342);
    stat1.next(235);
    stat1.next(224);
    stat1.next(663);
    stat1.next(424);
    stat1.next(434);

    stat1.display();

    statistic stat2;

    outfile << "Entering into Sequence 2.\n";

    stat2.next(103);
    stat2.next(821);
    stat2.next(871);
    stat2.next(487);
    stat2.next(312);
    stat2.next(245);
    stat2.next(224);
    stat2.next(623);
    stat2.next(424);
    stat2.next(432);

    stat2.display();

    if (stat1 == stat2)
    {
        outfile << "The two sequences are equal.\n\n";
    }
    else
    {
        outfile << "The two sequences are not equal.\n\n";
    }

    if (stat1 != stat2)
    {
        outfile << "The two sequences are not equal.\n\n";
    }
    else
    {
        outfile << "The two sequences are equal.\n\n";
    }

    statistic stat3;

    outfile << "Adding the two sequences.\n";

    stat3 = stat1 + stat2;

    outfile << stat3;

    return 0;
}

statistic::statistic()
{
    total = 0;
    amount = 0;
    high = 0;
    low = 0;
}

void statistic::fresh()
{
    total = 0;
    amount = 0;
    high = 0;
    low = 0;
}

void statistic::next(float x)
{
    end = x;
    total += x;
    amount += 1;

    if (end < low || low == 0)
    {
        low = end;
    }

    if (end > high || high == 0)
    {
        high = end;
    }
}

int statistic::length()
{
    return amount;
}

float statistic::max()
{
    return high;
}

float statistic::min()
{
    return low;
}

float statistic::sum()
{
    return total;
}

float statistic::mean()
{
    avg = total / amount;
    return avg;
}

float statistic::last()
{
    return end;
}

void statistic::display()
{
    outfile << "The length of the sequence is: " << amount << endl;
    outfile << "The sum of all the numbers is: " << total << endl;

    if (amount > 0)
    {
        outfile << "The last number entered was: " << end << endl;
        outfile << "The highest value is: " << high;
        outfile << "\nThe lowest value is: " << low << endl;
        outfile << "The arithmetic mean of the numbers is: " << mean() << endl;
    }
    else
    {
        outfile << "The sequence is empty. There for there is no last ";
        outfile << "number, max/min, or \narithmetic mean.\n";
    }

    outfile << "\n\n";
}

bool operator==(const statistic &stat1, const statistic &stat2)
{
    return (stat1.sum() == stat2.sum())
    && (stat1.length() == stat2.length())
    && (stat1.max() == stat2.max())
    && (stat1.min() == stat2.min());
}

statistic operator +(const statistic& stat1, const statistic& stat2)
{
    statistic n_stat;

    n_stat.total = stat1.total + stat2.total;
    n_stat.amount = stat1.amount + stat2.amount;

    if (stat1.high > stat2.high)
    {
        n_stat.high = stat1.high;
    }
    else
    {
        n_stat.high = stat2.high;
    }

    if (stat1.low < stat2.low)
    {
        n_stat.low = stat1.low;
    }
    else
    {
        n_stat.low = stat2.low;
    }

    n_stat.avg = n_stat.total / n_stat.amount;

    return n_stat;
}

bool operator !=(statistic const &stat1, statistic const &stat2)
{
    return !(stat1 == stat2);
}

ostream& operator <<(ostream& output, const statistic& stat3)
{
    output << "The length of the two sequences are: " << stat3.amount << endl;
    output << "The sum of all the numbers is: " << stat3.total << endl;
    output << "The highest value is: " << stat3.high << endl;
    output << "The lowest value is: " << stat3.low << endl;
    output << "The arithmetic mean of the two sequences are: " << stat3.avg << endl;

    return output;
}

Please help me.

Member Avatar
subith86
Junior Poster
127 posts since Mar 2011
Reputation Points: 17 [?]
Q&As Helped to Solve: 15 [?]
Skill Endorsements: 1 [?]
 
0
 

You are calling a non-const function by a const object. Hence the error. Make the functions as const and you'll get rid of this error.

int statistic::length() const
{
    return amount;
}

There seems to be another solution to this. I haven't tried it and I seriously believe it is NOT a reliable solution. Use const_cast on your object before calling those non-const functions.

Member Avatar
gusano79
Practically a Posting Shark
816 posts since May 2004
Reputation Points: 203 [?]
Q&As Helped to Solve: 131 [?]
Skill Endorsements: 10 [?]
 
0
 

You are calling a non-const function by a const object. Hence the error. Make the functions as const and you'll get rid of this error.

int statistic::length() const
{
    return amount;
}

This is a good practice in general--if your member functions don't change the object, declare them const .

There seems to be another solution to this. I haven't tried it and I seriously believe it is NOT a reliable solution. Use const_cast on your object before calling those non-const functions.

Yeah, don't do that. There are legitimate uses for const_cast , but you may live your entire life without needing it.

Member Avatar
therockon7throw
Newbie Poster
15 posts since Feb 2012
Reputation Points: 0 [?]
Q&As Helped to Solve: 2 [?]
Skill Endorsements: 0 [?]
 
0
 

I can't figure out what this error is saying.

Error:

C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp||In function 'bool operator==(const statistic&, const statistic&)':|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|225|error: passing 'const statistic' as 'this' argument of 'float statistic::sum()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|225|error: passing 'const statistic' as 'this' argument of 'float statistic::sum()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|226|error: passing 'const statistic' as 'this' argument of 'int statistic::length()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|226|error: passing 'const statistic' as 'this' argument of 'int statistic::length()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|227|error: passing 'const statistic' as 'this' argument of 'float statistic::max()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|227|error: passing 'const statistic' as 'this' argument of 'float statistic::max()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|228|error: passing 'const statistic' as 'this' argument of 'float statistic::min()' discards qualifiers|
C:\Users\Kyle\School\CS 372\Statistician\Statistician.cpp|228|error: passing 'const statistic' as 'this' argument of 'float statistic::min()' discards qualifiers|
||=== Build finished: 8 errors, 0 warnings ===|

Problem with the code starts in the Bool operator ==, function towards the bottom.

// Kyle Bennett
// CS 372
// Throttle Class

#include <iostream>
#include <cstdlib>
#include <fstream>


using namespace std;

ofstream outfile;

class statistic
{
    public:
        statistic();
        void fresh();
        void next(float);
        int length();
        float max();
        float min();
        float sum();
        float mean();
        float last();
        void display();
        friend statistic operator +(const statistic &stat1, const statistic &stat2);
        friend ostream& operator <<(ostream& output, const statistic& stat2);
    private:
        float avg;
        float high;
        float low;
        float total;
        int amount;
        float end;
};

bool operator ==(statistic const &stat1, statistic const &stat2);
bool operator !=(statistic const &stat1, statistic const &stat2);

int main()
{
    outfile.open("statout.out");  //open outfile
    if (!outfile)                // check outfile
    {
        outfile << "Output file did not open.\n";
        return 1;
    }

    statistic stat1;

    stat1.next(5.5);
    stat1.next(6.6);
    stat1.next(8.8);
    stat1.next(-3.4);
    stat1.next(-0.5);
    stat1.next(4.7);
    stat1.next(9.1);

    stat1.display();

    stat1.next(5.2);
    stat1.next(-3.3);
    stat1.next(-8.5);
    stat1.next(3.2);
    stat1.next(5.5);

    stat1.display();

    outfile << "Starting a new sequence.\n";

    stat1.fresh();

    stat1.display();

    outfile << "Entering into Sequence 1.\n";

    stat1.next(301);
    stat1.next(211);
    stat1.next(981);
    stat1.next(487);
    stat1.next(342);
    stat1.next(235);
    stat1.next(224);
    stat1.next(663);
    stat1.next(424);
    stat1.next(434);

    stat1.display();

    statistic stat2;

    outfile << "Entering into Sequence 2.\n";

    stat2.next(103);
    stat2.next(821);
    stat2.next(871);
    stat2.next(487);
    stat2.next(312);
    stat2.next(245);
    stat2.next(224);
    stat2.next(623);
    stat2.next(424);
    stat2.next(432);

    stat2.display();

    if (stat1 == stat2)
    {
        outfile << "The two sequences are equal.\n\n";
    }
    else
    {
        outfile << "The two sequences are not equal.\n\n";
    }

    if (stat1 != stat2)
    {
        outfile << "The two sequences are not equal.\n\n";
    }
    else
    {
        outfile << "The two sequences are equal.\n\n";
    }

    statistic stat3;

    outfile << "Adding the two sequences.\n";

    stat3 = stat1 + stat2;

    outfile << stat3;

    return 0;
}

statistic::statistic()
{
    total = 0;
    amount = 0;
    high = 0;
    low = 0;
}

void statistic::fresh()
{
    total = 0;
    amount = 0;
    high = 0;
    low = 0;
}

void statistic::next(float x)
{
    end = x;
    total += x;
    amount += 1;

    if (end < low || low == 0)
    {
        low = end;
    }

    if (end > high || high == 0)
    {
        high = end;
    }
}

int statistic::length()
{
    return amount;
}

float statistic::max()
{
    return high;
}

float statistic::min()
{
    return low;
}

float statistic::sum()
{
    return total;
}

float statistic::mean()
{
    avg = total / amount;
    return avg;
}

float statistic::last()
{
    return end;
}

void statistic::display()
{
    outfile << "The length of the sequence is: " << amount << endl;
    outfile << "The sum of all the numbers is: " << total << endl;

    if (amount > 0)
    {
        outfile << "The last number entered was: " << end << endl;
        outfile << "The highest value is: " << high;
        outfile << "\nThe lowest value is: " << low << endl;
        outfile << "The arithmetic mean of the numbers is: " << mean() << endl;
    }
    else
    {
        outfile << "The sequence is empty. There for there is no last ";
        outfile << "number, max/min, or \narithmetic mean.\n";
    }

    outfile << "\n\n";
}

bool operator==(const statistic &stat1, const statistic &stat2)
{
    return (stat1.sum() == stat2.sum())
    && (stat1.length() == stat2.length())
    && (stat1.max() == stat2.max())
    && (stat1.min() == stat2.min());
}

statistic operator +(const statistic& stat1, const statistic& stat2)
{
    statistic n_stat;

    n_stat.total = stat1.total + stat2.total;
    n_stat.amount = stat1.amount + stat2.amount;

    if (stat1.high > stat2.high)
    {
        n_stat.high = stat1.high;
    }
    else
    {
        n_stat.high = stat2.high;
    }

    if (stat1.low < stat2.low)
    {
        n_stat.low = stat1.low;
    }
    else
    {
        n_stat.low = stat2.low;
    }

    n_stat.avg = n_stat.total / n_stat.amount;

    return n_stat;
}

bool operator !=(statistic const &stat1, statistic const &stat2)
{
    return !(stat1 == stat2);
}

ostream& operator <<(ostream& output, const statistic& stat3)
{
    output << "The length of the two sequences are: " << stat3.amount << endl;
    output << "The sum of all the numbers is: " << stat3.total << endl;
    output << "The highest value is: " << stat3.high << endl;
    output << "The lowest value is: " << stat3.low << endl;
    output << "The arithmetic mean of the two sequences are: " << stat3.avg << endl;

    return output;
}

Please help me.

Hi

Actually for methods like

int length();

,

float max () ;

and the min , last... you should have two version one const and the other normal one.
For example;

int length()const ;
int length();
Member Avatar
gusano79
Practically a Posting Shark
816 posts since May 2004
Reputation Points: 203 [?]
Q&As Helped to Solve: 131 [?]
Skill Endorsements: 10 [?]
 
0
 

you should have two version one const and the other normal one.
For example;

int length()const ;
int length();

What does this get you that you don't already have with int length() const; ? The const lets you use length() when you have a const reference to an instance of your class, but it doesn't prevent anything when you don't. Or am I missing something?

You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
View similar articles that have also been tagged: