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

Абстрактный класс - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.69
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
03.11.2010, 22:31     Абстрактный класс #1
Есть базовый абстрактный класс. От него - 2 производных класса.
Проблемы: 1) Понимаю, что я не правильно вызываю мои чисто вирт. методы.Как правильно вызывать мои чисто вируальные методы(см. main )?
2) Как правильно должен быть организован деструктор в данном варианте?

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
class base
{
public:
    int n;
    virtual void AddDate()=0;
    void WeightSort(); 
    void EndAddress(); 
    virtual void print()=0;
};
class first:public base
{
public:
     void AddDate();
    void print()
    {
        for(int i=0;i<n;i++)
        cout<<"naznachenie: "<<naznachenie[i]<<"; weight: "<<weight[i]<<endl;
    }
private:
    char **naznachenie;
    char *weight;
};
class second:public base
{
public:
     void AddDate();
    void print(){
        for(int i=0;i<n;i++)
            cout<<"name: "<<name[i]<<"; adress:"<<adress[i]<<endl;}
private:
    char **name;
    char *adress;
};
 
void first::AddDate()
{
    cout<<" how match:?"<<endl;
    cin>>n;
    char str[33];
    naznachenie = new char*[n];
    weight = new char[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input naznachenie:"<<endl;
        cin>>str;
        naznachenie[i] = new char [strlen(str)+1];
        strcpy(naznachenie[i],str);
        cout<<"input weight:"<<endl;
        cin>>weight[i];
    }
}
void second::AddDate()
{
    char str1[33];
    name = new char*[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input name:"<<endl;
        cin>>str1;
        name[i] = new char [strlen(str1)+1];
        strcpy(name[i],str1);
        cout<<"input adress"<<endl;
        cin>>adress[i];
    }
}
void main()
{
    first fst;
    fst.AddDate();
    fst.print();
    second snd;
    snd.AddDate();
    snd.print();
    system("PAUSE");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2010, 22:31     Абстрактный класс
Посмотрите здесь:

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ Абстрактный класс
C++ Абстрактный класс
C++ Создать класс - данные - абстрактный базовый класс. Создать производные классы
C++ Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
patriot2008
 Аватар для patriot2008
70 / 70 / 4
Регистрация: 04.12.2008
Сообщений: 463
05.11.2010, 17:17     Абстрактный класс #21
Цитата Сообщение от ISergey Посмотреть сообщение
base::~base(){ std::cout << "" << std::endl; }
круто, хоть и первый раз вижу такой деструктор...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
05.11.2010, 19:27  [ТС]     Абстрактный класс #22
Вопрос: каким образом класс first видит переменную "n" ??
(т.е. как я понял, где это(см.ниже) написано, там и "n" определена.)
C++
1
2
cout<<" how match:?"<<endl;
    cin>>n;
Но так же не правильно? Нельзя же ведь задавать переменную "n" и в 1-ом производном классе и во втором? Как можно сделать правильно?
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 02:37     Абстрактный класс #23
ISergey, да, действительно, абстрактные функции могут иметь тела. Стыдно, но я этого не знал.
Правда, используется это редко, и в данном случае не нужно.

Добавлено через 15 минут
zhenya.ya, переменные у каждого экземпляра каждого класса свои, со своими значениями. Если некоторая переменная нужна в двух разных экземплярах двух разных классов, то, значит, нужно построить программу как-то по-другому.
То есть либо ты вводишь эту переменную в каждом классе, либо ты вводишь её вне классов и затем передаёшь в функции.
KpeHDeJIb
 Аватар для KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
06.11.2010, 13:39     Абстрактный класс #24
Цитата Сообщение от volovzi Посмотреть сообщение
да, действительно, абстрактные функции могут иметь тела.
Ну да, могут иметь, класс все равно абстрактный будет, но в потомках можно вызывать эту функцию.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.11.2010, 13:48  [ТС]     Абстрактный класс #25
так ли Вы имели в виду? ( и как можно передовать "n" деструкторам?)
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
class base
{
public:
    virtual ~base(){}
    virtual void AddDate(int n)=0;
    virtual void print(int n)=0;
    void WeightSort(); 
};
class first:public base
{
public:
    first(){naznachenie=NULL; weight=NULL;}
    virtual ~first();
    void AddDate(int n);
    void print(int n)
    {
        for(int i=0;i<n;i++)
        cout<<"naznachenie: "<<naznachenie[i]<<"; weight: "<<weight[i]<<endl;
    }
private:
    char **naznachenie;
    char *weight;
};
class second:public base
{
public:
    second(){adress=0;}
    virtual ~second();
     void AddDate(int n);
    void print(int n){
        for(int i=0;i<n;i++)
            cout<<"name: "<<name[i]<<"; adress:"<<adress[i]<<endl;}
private:
    char **name;
    char *adress;
};
 
    void first::AddDate(int n)
{
    char str[33];
    naznachenie = new char*[n];
    weight = new char[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input naznachenie:"<<endl;
        cin>>str;
        naznachenie[i] = new char [strlen(str)+1];
        strcpy(naznachenie[i],str);
        cout<<"input weight:"<<endl;
        cin>>weight[i];
    }
}
void second::AddDate(int n)
{
    char str1[33];
    name = new char*[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input name:"<<endl;
        cin>>str1;
        name[i] = new char [strlen(str1)+1];
        strcpy(name[i],str1);
        cout<<"input adress"<<endl;
        cin>>adress[i];
    }
}
first::~first()
{
        for (int i = 0; i < n; i++)
         delete[] naznachenie[i];
        delete[] naznachenie;
        delete[] weight;
}
second::~second()
{
        for (int i = 0; i < n; i++)
        delete []name[i];
        delete []name;
        delete []adress;
}
 
void main()
{
    int n;
    cout<<" how match:?"<<endl;
    cin>>n;
    base *p;
       first fst;
       second snd;
 
       p=&fst;
       p->AddDate(n);
       p->print(n);
  
       p = &snd;
       p->AddDate(n);
       p->print(n);
       system("PAUSE");
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 13:57     Абстрактный класс #26
zhenya.ya, не совсем. Тебе нужно объявить переменную "n" в базовом классе, но устанавливать её значение для каждого экземпляра класса отдельно. Например, передавать её в конструктор класса.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.11.2010, 18:31  [ТС]     Абстрактный класс #27
Т.е. вот таким образом?! :

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
class base
{
public:
    int n;
    base(){n=0;}
    virtual ~base(){}
    virtual void AddDate()=0;
    virtual void print()=0;
    void WeightSort(); 
};
class first:public base
{
public:
    int n;
    first(){naznachenie=NULL; weight=NULL;}
    virtual ~first();
    void AddDate();
    void print()
    {
        for(int i=0;i<n;i++)
        cout<<"naznachenie: "<<naznachenie[i]<<"; weight: "<<weight[i]<<endl;
    }
private:
    char **naznachenie;
    char *weight;
};
class second:public base
{
public:
    int n;
    second(){adress=0;}
    virtual ~second();
     void AddDate();
    void print(){
        for(int i=0;i<n;i++)
            cout<<"name: "<<name[i]<<"; adress:"<<adress[i]<<endl;}
private:
    char **name;
    char *adress;
};
 
    void first::AddDate()
{
    cout<<" how match:?"<<endl;
    cin>>n;
    char str[33];
    naznachenie = new char*[n];
    weight = new char[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input naznachenie:"<<endl;
        cin>>str;
        naznachenie[i] = new char [strlen(str)+1];
        strcpy(naznachenie[i],str);
        cout<<"input weight:"<<endl;
        cin>>weight[i];
    }
}
void second::AddDate()
{
    cout<<" how match:?"<<endl;
    cin>>n;
    char str1[33];
    name = new char*[n];
    for(int i=0;i<n;i++)
    {
        cout<<"input name:"<<endl;
        cin>>str1;
        name[i] = new char [strlen(str1)+1];
        strcpy(name[i],str1);
        cout<<"input adress"<<endl;
        cin>>adress[i];
    }
}
first::~first()
{
        for (int i = 0; i < n; i++)
         delete[] naznachenie[i];
        delete[] naznachenie;
        delete[] weight;
}
second::~second()
{
        for (int i = 0; i < n; i++)
        delete []name[i];
        delete []name;
        delete []adress;
}
 
void main()
{
    base *p;
       first fst;
       second snd;
 
       p=&fst;
       p->AddDate();
       p->print();
  
       p = &snd;
       p->AddDate();
       p->print();
       system("PAUSE");
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 18:40     Абстрактный класс #28
Ага, только в производных классах не нужно переопределять переменную "n", потому что она уже есть в базовом.
И ещё нужно выделить память под переменную "address", а то возникает ошибка доступа к памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2010, 20:35     Абстрактный класс
Еще ссылки по теме:

C++ Абстрактный класс
C++ абстрактный класс
Абстрактный класс/Класс интерфейс C++

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

Или воспользуйтесь поиском по форуму:
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.11.2010, 20:35  [ТС]     Абстрактный класс #29
И еще одна проблема:
почему не работает p->WeightWort() в main() ??

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
class base
{
public:
    int n;
    base(){n=0;}
    virtual ~base(){}
    virtual void AddDate()=0;
    virtual void print()=0;
    virtual void WeightSort(); 
};
class first:public base
{
public:
    first(){naznachenie=NULL; weight=NULL;}
    virtual ~first();
    void AddDate();
    void print()
    {
        for(int i=0;i<n;i++)
        cout<<"naznachenie: "<<naznachenie[i]<<"; weight: "<<weight[i]<<endl;
    }
    void WeightSort(); 
private:
    char **naznachenie;
    int *weight;
};
class second:public base
{
public:
    second(){adress=NULL;}
    virtual ~second();
     void AddDate();
    void print(){
        for(int i=0;i<n;i++)
            cout<<"name: "<<name[i]<<"; adress:"<<adress[i]<<endl;}
private:
    char **name;
    char **adress;
};
 
...
...
...
    void first::WeightSort()
{
    int b;
    for(int j=1;j<n;j++)
        for(int i=0;i<n-j;i++)
            if(weight[i]>weight[i+1])
            {
                b=weight[i];
                weight[i]=weight[i+1];
                weight[i+1]=b;
            }
            for(int i=0;i<n;i++)
            {
                if(weight[i]<1000) cout<<"(<50)__it`s a letter!"<<endl;
                else cout<<"__it`s a banderol or send"<<endl;
            }
            system("pause");
}
first::~first()
{
        for (int i = 0; i < n; i++)
        delete[] naznachenie[i];
        delete[] naznachenie;
        delete[] weight;
}
second::~second()
{
        for (int i = 0; i < n; i++)
        {
        delete []name[i];
        delete []adress[i];
        }
        delete []name;
        delete []adress;
}
 
void main()
{
    base *p;
       first fst;
       second snd;
 
       p=&fst;
       p->AddDate();
       p->WeightSort();
       p->print();
  
       p = &snd;
       p->AddDate();
       p->print();
 
       system("PAUSE");
}
Yandex
Объявления
06.11.2010, 20:35     Абстрактный класс
Ответ Создать тему
Опции темы

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