Форум программистов, компьютерный форум CyberForum.ru

компилятор считает объект l-value, но объект таковым не является - C++

Восстановить пароль Регистрация
 
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
14.03.2013, 16:58     компилятор считает объект l-value, но объект таковым не является #1
итак
есть базовый абстрактный класс Дерево, есть два его наследника Плодовое Дерево и Лесное Дерево. Также существует класс Контейнер Деревьев. В функции добавления в контейнер выскакивает ошибка "error C2166: l-value specifies const object", не могу понять, почему

head.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#ifndef _TREEE_
#define _TREEE_
#include <iostream>
#include <cmath>
using namespace std;
enum Type {list, hvoy};
class Tree{
protected:
    friend class Cont;
    const int ID;
    char * Name;
    unsigned Age;
    const Type Tip;
    static int ID_Repository;
    static public void SetID_Repository (int a) {ID_Repository=a;}
public:
    Tree();
    Tree(char * aName, unsigned aAge, Type aTip);
    Tree (const Tree& Ob);
    virtual ~Tree();
    int GetID() const ;
    char * GetName () const;
    unsigned GetAge () const;
    Type GetTip ()const;
    bool operator < (const Tree & e) const;
    bool operator == (const Tree & e) const;
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    virtual void InStream (ostream& out)=0;
    void Print ();
    void operator = (const Tree & e);
};
class LesTree: public Tree {
protected:
    double Drev;
public:
    LesTree();
    LesTree(char * aName, unsigned aAge, Type aTip, double aDrev);
    LesTree (const LesTree& Ob);
    ~LesTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetDrev () const;
    Type GetTip ()const;
    bool operator < (const LesTree & e) const{return Tree::operator < (e);}
    bool operator == (const LesTree & e) const{return Tree::operator == (e);}
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetDrev (double aDrev);
    void InStream (ostream& out);
    LesTree& operator = (const LesTree & e);
};
class PlodTree : public Tree{
    protected:
    double Mas;
    double Hran;
public:
    PlodTree();
    PlodTree(char * aName, unsigned aAge, Type aTip, double Mas, double Hran);
    PlodTree (const PlodTree& Ob);
    ~PlodTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetMas () const;
    double GetHran () const;
    Type GetTip ()const;
    bool operator < (const PlodTree & e) const {return Tree::operator <(e);}
    bool operator == (const PlodTree & e) const {return Tree::operator == (e);}
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetMas (double aMas);
    void SetHran (double aHran);
    void InStream (ostream& out);
    PlodTree& operator = (const PlodTree & e);
};
class Cont {
    Tree **info;
    int capacity,count;
public:
    Cont(int an=3):capacity(an),count(0){
        info=new Tree*[capacity];
    }
    Cont (const Cont & Ob){
        capacity=Ob.capacity;
        count=Ob.count;
        info=new Tree*[capacity];
        for (int i=0;i<count;i++)
            *info[i]=*Ob.info[i];
    }
    ~Cont ()
    {
        for (int i = 0; i < count; ++i)
            delete info[i];
        delete [] info;
        count = 0;
    }
    bool isEmpty(){return (count==0);}
    bool Add (const Tree* a)const
    {
        if (count == capacity) return false;
        if (typeid(a) == typeid(LesTree))
        {
             char * Name=a->GetName();
             int Age=a->GetAge();
             Type Tip=a->GetTip();
             double Drev=((LesTree*)a)->GetDrev();
             LesTree *k=new LesTree(Name,Age,Tip,Drev);
             info[count++]=k;}
        else
        {
             char * Name=a->GetName();
             int Age=a->Age;
             Type Tip=a->Tip;
             double Mas=((PlodTree*)a)->GetMas();
             double Hran=((PlodTree*)a)->GetHran();
             PlodTree *k=new PlodTree(Name,Age,Tip,Mas,Hran);
             info[count++]=k;}
        return true;}
    void Print (){
        for (int i=0;i<count;i++)
        {
            (*info[i]).InStream(cout);
            cout<<endl;}
    }
    Tree& operator [] (int i){
        return *info[i];}
    int ListCounter (){
        int listcount=0;
        for (int i=0;i<count;i++)
            if ((*info[i]).Tip==list) listcount++;
        return listcount;}
    void SortName (){
        for (int i=0;i<count;i++)
            for (int j=0;j<count-1;j++)
                if (strcmp((*info[i]).Name,(*info[i+1]).Name)>0){
                    char * s=new char[strlen((*info[i]).Name)+1];
                    strcpy(s,(*info[i]).Name);
                    delete [](*info[i]).Name;
                    (*info[i]).Name=new char[strlen((*info[i+1]).Name)+1];
                    strcpy((*info[i]).Name,(*info[i+1]).Name);
                    delete [](*info[i+1]).Name;
                    (*info[i+1]).Name=new char[strlen(s)+1];
                    strcpy((*info[i+1]).Name,s);
                    delete []s;}
    }
    void SortAge(){
        for (int i=0;i<count;i++)
            for (int j=0;j<count-1;j++)
                if( (*info[i]).Age<(*info[i+1]).Age)
                {
                    (*info[i]).Age+=(*info[i+1]).Age;
                    (*info[i+1]).Age=(*info[i]).Age-(*info[i+1]).Age;
                    (*info[i]).Age-=(*info[i+1]).Age;
                }
    }
};
#endif
real.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "head.h"
char *tip[2]={"Лиственное","Хвойное"};
int Tree::ID_Repository = 0;
Tree::Tree():ID(ID_Repository++),Age(100),Tip(list){
    char * s = "Дуб";
    Name=new char[strlen(s)+1];
    strcpy(Name,s);
}
Tree::Tree(char * aName, unsigned aAge, Type aTip):ID(ID_Repository++),Age(aAge),Tip(aTip){
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
Tree::Tree (const Tree& Ob):Age(Ob.Age),Tip(Ob.Tip),ID(ID_Repository++){
    Name=new char [strlen(Ob.Name)+1];
    strcpy(Name,Ob.Name);
}
Tree::~Tree(){
    delete []Name;
}
int Tree::GetID() const {
    return ID;
}
char * Tree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy (s,Name);
    return s;
}
unsigned Tree::GetAge () const{
    return Age;
}
Type Tree::GetTip ()const{
    return Tip;
}
bool Tree::operator < (const Tree & e) const{
    if (strcmp(Name,e.Name)<0)
        return true;
    return false;
}
bool Tree::operator == (const Tree & e) const{
    if (strcmp(Name,e.Name)==0)
        return true;
    return false;
}
void Tree::SetAge (unsigned aAge){
    Age=aAge;
}
void Tree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
void Tree::operator = (const Tree & e){}
void Tree::Print (){
    cout<<"Возраст: "<<Age<<" Тип: "<<tip[Tip]<<" Имя: ";
    puts(Name);
}
LesTree::LesTree():Tree("Дуб",100,list),Drev(23){}
LesTree::LesTree(char * aName, unsigned aAge, Type aTip, double aDrev):Tree(aName, aAge, aTip),Drev(aDrev){}
LesTree::LesTree (const LesTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Drev(Ob.Drev){}
LesTree::~LesTree(){}
int LesTree::GetID() const {return ID;}
char * LesTree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned LesTree::GetAge () const {return Age;}
double LesTree::GetDrev () const {return Drev;}
Type LesTree::GetTip ()const {return Tip;}
void LesTree::SetAge (unsigned aAge){Age=aAge;}
void LesTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
void LesTree::SetDrev (double aDrev){Drev=aDrev;}
void LesTree::InStream (ostream& out){
    out<<"Имя: "<<Name<<" Возраст: "<<Age<<" Идентификатор: "<<ID<<" Масса древесины: "<<Drev<<" Тип: "<<tip[Tip];}
LesTree& LesTree::operator = (const LesTree & e){
    if (&e!=this)
    {
        Age=e.Age;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
        Drev=e.Drev;}
    return *this;
}
PlodTree::PlodTree():Tree("Яблоня",10,list),Mas(10.5),Hran(3){}
PlodTree::PlodTree(char * aName, unsigned aAge, Type aTip, double aMas, double aHran):Tree(aName,aAge,aTip),Mas(aMas),Hran(aHran){}
PlodTree::PlodTree (const PlodTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Mas(Ob.Mas),Hran(Ob.Hran){}
PlodTree::~PlodTree(){}
int PlodTree::GetID() const {return ID;}
char * PlodTree::GetName () const {
    char *s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned PlodTree::GetAge () const {return Age;}
double PlodTree::GetMas () const {return Mas;}
double PlodTree::GetHran () const {return Hran;}
Type PlodTree::GetTip ()const {return Tip;}
//bool PlodTree::operator < (const PlodTree & e) const;//?
//bool PlodTree::operator == (const PlodTree & e) const;//?
void PlodTree::SetAge (unsigned aAge){Age=aAge;}
void PlodTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);}
void PlodTree::SetMas (double aMas) {Mas=aMas;}
void PlodTree::SetHran (double aHran){Hran=aHran;}
void PlodTree::InStream (ostream& out){
    out<<"Имя: "<<Name<<" Возраст: "<<Age<<" Идентификатор: "<<ID<<" Масса плода: "<<Mas<<" Время хранения: "<<Hran<<" Тип: "<<tip[Tip];}
PlodTree& PlodTree::operator = (const PlodTree & e){
    if (this!=&e)
    {
        Age=e.Age;
        Mas=e.Mas;
        Hran=e.Hran;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
    }
    return *this;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "head.h"
#include <fstream>
    int main ()
    {
        setlocale (LC_ALL,".1251");
        ifstream in("input.txt");
        PlodTree pa("Груша",1,list,0,0);
        PlodTree pb("Яблоня",13,list,12,6);
        if (pa<pb)
            cout<<"first is less then second"<<endl;
        else cout<<"second is less then first"<<endl;
        if(pa==pb)
            cout<<"they are equal"<<endl;
        else cout<<"they are not equal"<<endl;
        char* s;
        int i=0;
        in.getline(s,200);
        char **mas;
        char * token=strtok(s," ");
        Cont c;
        while (token)
        {
            strcpy(mas[i],token);
            token=strtok(NULL," ");
            i++;
        }
        int n=i;
        if (atoi(mas[0])==0)
        {
            if(n==5 && atoi(mas[2])>0 && strcmp(mas[3],"Лиственное")==0 && atoi(mas[4])>0){
                LesTree *k=new LesTree(mas[1],atoi(mas[2]),list,atoi(mas[4]));
                if (c.Add(k)) cout<<"everything is ok"<<endl;}
            if (n==5 && atoi(mas[2])>0 && strcmp(mas[3],"Хвойное")==0 && atoi(mas[4])>0){
                LesTree *k=new LesTree(mas[1],atoi(mas[2]),hvoy,atoi(mas[4]));
                if(c.Add(k)) cout<<"everything is ok";}
        }
        if (atoi(mas[0])==1)
        {
            if(n==6 && atoi(mas[2])>0 && strcmp(mas[3],"Лиственное")==0 && atoi(mas[4])>0 && atoi(mas[5])>0){
                PlodTree *k=new PlodTree(mas[1],atoi(mas[2]),list,atoi(mas[4]),atoi(mas[5]));
                if (c.Add(k)) cout<<"everything is ok";}
            if (n==6 && atoi(mas[2])>0 && strcmp(mas[3],"Хвойное")==0 && atoi(mas[4])>0 && atoi(mas[5])>0){
                PlodTree *k=new PlodTree(mas[1],atoi(mas[2]),hvoy,atoi(mas[4]),atoi(mas[5]));
                if(c.Add(k)) cout<<"everything is ok";}
        }
        return 0;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2013, 16:58     компилятор считает объект l-value, но объект таковым не является
Посмотрите здесь:

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
как узнать,является данный объект класса А1 наследником класса А2 C++
Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту? C++
C++ Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?
Может ли объект-член, или объект-элемент достучаться к содержащему его? C++
C++ Создать объект стек и создать объект очередь с перегруженными операциями

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 17:03     компилятор считает объект l-value, но объект таковым не является #2
C++
1
bool Add (const Tree* a)const
метод добавления не должен быть константным
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
14.03.2013, 17:06  [ТС]     компилятор считает объект l-value, но объект таковым не является #3
точно
спасибо большое)
Yandex
Объявления
14.03.2013, 17:06     компилятор считает объект l-value, но объект таковым не является
Ответ Создать тему
Опции темы

Текущее время: 14:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru