Ошибка вывода дерева C ++ - PullRequest
       4

Ошибка вывода дерева C ++

3 голосов
/ 03 апреля 2012

для моего класса структур данных мы создаем структуру данных, которую мы можем использовать для простого хранения и организации данных. У меня проблема с функцией вывода моего дерева. Я получаю сообщение об ошибке:

AccountDB.cpp: In member function ‘void AccountDB::output(std::ostream&) const’:
AccountDB.cpp:23:21: error: passing ‘const AccountDB’ as ‘this’ argument of ‘void    
AccountDB::output(std::ostream&, const AccountDB::Elem*)’ discards qualifiers [-fpermissive]

Я смотрю по сторонам, и мой выходной код выглядит очень похоже на то, что сделали другие люди. Я понятия не имею, и я действительно не понимаю, что пытается сказать ошибка.

Спасибо за вашу помощь.

Заголовок:

#ifndef ACCOUNTDB_H
#define ACCOUNTDB_H


#include <iostream>

using namespace std;


#include "AccountRecord.h"

class AccountDB {

public:
    AccountDB();
    ~AccountDB();
    void insert( const AccountRecord &v );
    AccountRecord * get( const AccountRecord &v );
    void output( ostream &s ) const;

private:
    struct Elem {
        AccountRecord info;
        Elem *left;
        Elem *right;
    };

Elem *root;

void insert( const AccountRecord &v, Elem *&e );
AccountRecord * get( const AccountRecord &v, Elem *&e );
void output( ostream &s, const Elem *e );

};

ostream &operator << ( ostream &s, const AccountDB &v );

#endif

Источник

#include "AccountDB.h"

//default constructor
AccountDB::AccountDB() {
    root = 0;
}

//destructor
AccountDB::~AccountDB() {

}

//public
void AccountDB::insert( const AccountRecord &v ) {
    return insert( v, root );
}

AccountRecord * AccountDB::get( const AccountRecord &v ) {
    return get( v, root );
}

void AccountDB::output( ostream &s ) const {
    output( s, root );
}

//private
void AccountDB::insert( const AccountRecord &v, Elem *&e ) {
    if( e == NULL ) {
        e = new Elem();
        e->info = v;
    }

    else if( v < e->info )
        insert( v, e->left );
    else if( v > e->info )
        insert( v, e->right );
}

AccountRecord * AccountDB::get( const AccountRecord &v, Elem *&e ){
    if( e->info == v )
        return &(e->info);
    else if( v < e->info && e->left != NULL )
        get( v, e->left );
    else if( v > e->info && e->right != NULL )
        get( v, e-> right );
    else
        return NULL;
}

void AccountDB::output( ostream &s, const Elem *e ) {

    if( e != NULL ) {
        output( s, e->left );
        s << e->info << endl;
        output( s, e->right );
    }
}

ostream &operator << ( ostream &s, const AccountDB &v ) {
    v.output( s );
    return s;
}

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Ваша output функция не объявлена ​​const, поэтому, когда вы вызываете

output( s, root );

, компилятор сообщает вам, что вы вызываете неконстантную функцию из const функции.

Есть несколько способов справиться с этим - один из них сделать output const;другой - сделать output статичным (если можно).

2 голосов
/ 03 апреля 2012

Ошибка в том, что

void AccountDB::output( ostream &s, const Elem *e )

не объявлено как const, но вы вызываете его из метода const.

Измените объявление (и определение) на:

void output( ostream &s, const Elem *e ) const;

Вы можете сделать это, так как вы не изменяете никаких элементов внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...