Thread: std container issue (copy semantics?)

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Kiss the monkey. CodeMonkey's Avatar
    Join Date
    Sep 2001
    Posts
    937

    std container issue (copy semantics?)

    Hello,
    I'm creating a money-management program, and have run into a few related problems regarding std::vector s of my objects. Let's just dump it out:
    Windows Vista (on my new laptop ), Dev-C++
    error-spawning lines are in red.
    Code:
    C:/Dev-Cpp/include/c++/3.4.2/bits/vector.tcc: In member function `transaction& transaction::operator=(const transaction&)':
    C:/Dev-Cpp/include/c++/3.4.2/bits/vector.tcc:238:   instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = transaction, _Alloc = std::allocator<transaction>]'
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_vector.h:564:   instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = transaction, _Alloc = std::allocator<transaction>]'
    
    account.cpp:17:   instantiated from here
    C:/Dev-Cpp/include/c++/3.4.2/bits/vector.tcc:238: error: non-static const member `const Date transaction::date_created', can't use default assignment operator
    
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h: In function `const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = transaction]':
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:2484:   instantiated from `void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<transaction*, std::vector<transaction, std::allocator<transaction> > >, _Size = int]'
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:2555:   instantiated from `void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<transaction*, std::vector<transaction, std::allocator<transaction> > >]'
    account.cpp:18:   instantiated from here
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:90: error: passing `const transaction' as `this' argument of `bool transaction::operator<(const transaction&)' discards qualifiers
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:91: error: passing `const transaction' as `this' argument of `bool transaction::operator<(const transaction&)' discards qualifiers
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:93: error: passing `const transaction' as `this' argument of `bool transaction::operator<(const transaction&)' discards qualifiers
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:97: error: passing `const transaction' as `this' argument of `bool transaction::operator<(const transaction&)' discards qualifiers
    C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:99: error: passing `const transaction' as `this' argument of `bool transaction::operator<(const transaction&)' discards qualifiers
    Code:
    double account::transact(Date date_in, const std::string & name_in, double amount_in, bool nosort)
    {
           bal += amount_in;
           registry.push_back(transaction(date_in,name_in,amount_in,bal));       
           if(!nosort) std::sort(registry.begin(),registry.end());       
           return bal;
    }
    I think that is has to do with my operator <
    Code:
    bool transaction::operator< (const transaction & other) { return date < other.date; }
    
    //..... elsewhere......
    
    inline bool Date::operator< (const Date & x)
    {
           return y == x.year() ? ( m == x.month() ? d < x.day() : m < x.month() ) : y < x.year();
           //years are not same -> compare years
           //years are the same -> (months are not same -> compare months)
           //                      (months are the same -> compare days)
    }
    And, finally... the involed objects.....
    Code:
    class Date
    {
     public:
            enum Spec { today, yesterday, tomorrow };
            enum Month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
            
            Date(Month month_in = Month(0), int day_in = 0, int year_in = 0);
            Date(Spec s);
            std::string str();
            int day() const { return d; }
            int month() const { return m; }
            int year() const { return y; }
            bool operator < (const Date & x);
     private:
             int d;
             int y;
             Month m;
    };
    
    extern Date::Month & operator--(Date::Month &m);
    extern Date::Month & operator++(Date::Month &m);
    Code:
    class transaction
    {
    	public:
    		transaction( const Date& date_in = Date(), const std::string& name_in = std::string(), 
                         double amount_in = 0.0,       double new_bal_in = 0.0, 
                         const Date& date_created_in = Date(Date::today) );
    		~transaction() {}
    		
    		std::string file_rep();
    		std::string display_rep();
    		bool operator< (const transaction & other) { return date < other.date; }
    		
            Date date;
            const Date date_created;
            std::string name;
            double amount;
            double new_bal;
    };
    
    extern std::ostream & operator << (std::ofstream & s, transaction & tran);
    extern std::ostream & operator << (std::ostream & s, transaction & tran);
    Code:
    class account
    {
    	public:
    		account(const std::string & name_in);
    		~account();
    		
    		double transact(Date date_in, const std::string & name_in, double amount_in, bool nosort = false);
    		std::string display(unsigned int num = 0); //shows the last num transactions.
    		                                   //0 means show all.
            const std::string & name() const { return n; }
            double balance() const { return bal; }
             
    	private:
            std::vector<transaction> registry;
            double bal;
            std::string n;
    };
    Any help would be greatly appreciated.
    Last edited by CodeMonkey; 06-27-2007 at 05:13 PM. Reason: extra tag
    "If you tell the truth, you don't have to remember anything"
    -Mark Twain

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. List copy semantics efficiency
    By dudeomanodude in forum C++ Programming
    Replies: 31
    Last Post: 05-24-2008, 05:05 PM
  2. calling copy constructor from template
    By Ancient Dragon in forum C++ Programming
    Replies: 3
    Last Post: 09-28-2005, 01:54 PM
  3. dynamic memory alloccation & returning objects
    By haditya in forum C++ Programming
    Replies: 8
    Last Post: 04-21-2005, 11:55 PM
  4. Linked list copy constructor issue
    By Craptastic! in forum C++ Programming
    Replies: 1
    Last Post: 08-03-2003, 08:30 PM
  5. Copy Constructor Help
    By Jubba in forum C++ Programming
    Replies: 2
    Last Post: 11-07-2001, 11:15 AM