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

Виртуальные функции (создать массив указателей на объекты трех классов) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 10:32     Виртуальные функции (создать массив указателей на объекты трех классов) #1
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в массив: Имя-Группа, Имя-Группа-4 оценки, Имя-Группа-4 оценки-4 оценки.

Student.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
#include <iostream>
 
using namespace std;
 
class Student
{
protected:
    char *Name;
    int Group;
public: 
    Student () 
    {
        Name = NULL;
        Group = 0;
    }
    Student (int x, char *y)
    {
        Group = x;
        Name = y;
    }
    ~Student(){};
    virtual void Show()
    {
        cout << "Name: " << Name << endl << "Group: " << Group << endl;
    }
};
Student1.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
#include "Student.h"
class Student1:public Student 
{
protected:
    int marks1[4];
public:
    Student1 (): Student ()
    {
        for (int i=0; i<4; i++)
        {
            marks1[i]=0;
        }
    }
    Student1 (int x, char *y, int m1[4]):Student (x,y)
    {
        for (int i=0; i<4; i++)
        {
            marks1[i]=m1[i];
        }
    }
    ~Student1 () {};
    void Show() 
    {
        Student::Show();
        double ave = this->average();
        cout << "Marks: ";
        for(int i=0; i<4; i++)
        {
            cout << marks1[i] << " ";
        }
        cout << endl;
        cout << "The average: " << ave << endl; 
    }
    virtual double average()
    {
        double ave=0;
        for (int i=0; i<4; i++)
        ave += marks1[i];
        return ave/4;
    }
};
Student2.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
include "Student1.h"
 
class Student2: public Student1
{
protected:
    int marks2[4];
public:
    Student2 (): Student1 ()
    {
        for (int i=0; i<4; i++)
        {
            marks2[i]=0;
        }
    }
    Student2 (int x, char *y, int m1[4], int m2[4]): Student1 (x, y, m1)
    {
        for (int i=0; i<4; i++)
        {
            marks2[i]=m2[i];
        }
    }
    ~Student2 () {};
    void Show();
    double average();
};
 
void Student2::Show()
{
    double ave=this->average();
    cout << "Marks: ";
    for(int i=0;i<4;i++)
    {
        cout << marks1[i] << " ";
    }
    for(int i=0;i<4;i++)
    {
        cout << marks2[i] << " ";
    }
    cout << endl;
    cout << "The average: " << ave << endl; 
}
 
double Student2::average()
{
    double ave=0;
    for (int i=0;i<4;i++)
    ave += (marks1[i] + marks2[i]);
    return ave/8;
}
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
#include "Student2.h"
#include <conio.h>
void main ()
{
    Student *mass[3];
    for (int i=0; i<2; i++)
    {
        char name[20];
        int group, mark1[4], mark2[4];
        cout << "Vvedite informaciu o treh studentah (Imia, gruppa; Imia, gruppa, ocenki; Imia, gruppa, ocenki, ocenki.)" << endl;
        cin >> name >> group;
        mass[i++] = &Student (group, name);
        cin >> name >> group;
        for (int a=0; a<4; a++)
        {
            cin >> mark1[a];
        }
        mass[i++] = &Student1 (group, name, mark1);
        cin >> name >> group;
        for (int b=0; b<4; b++)
        {
            cin >> mark1[b];
        }
        for (int c=0; c<4; c++)
        {
            cin >> mark2[c];
        }
        mass[i] = &Student2 (group, name, mark1, mark2);
    }
    for (int i=0; i<3; i++)
    {
        mass[i]->Show();
    }
 
 
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 10:32     Виртуальные функции (создать массив указателей на объекты трех классов)
Посмотрите здесь:

C++ Массив указателей на объекты подклассов
Указатель на массив указателей на объекты, передать в метод объекта C++
C++ как понять: массив указателей на объекты классов?
C++ динамический массив указателей на объекты
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.12.2012, 11:13     Виртуальные функции (создать массив указателей на объекты трех классов) #2
C++
1
mass[i++] = &Student (group, name);
Так разве можно? У меня компилятор ругается на взятие адреса временного объекта.


C++
1
mass[i++] = new Student (group, name);
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.12.2012, 11:32     Виртуальные функции (создать массив указателей на объекты трех классов) #3
помимо этого у вас инициализация в цикл зачем то помещена и первый объект класса Student имеет индекс 1, воторой имеет индекс 2, и третий тоже 2

Добавлено через 11 минут
C++
1
2
3
4
5
 Student (int x, char *y)
    {
        Group = x;
        Name = y;
    }
из за такой инициализации у вас каждый раз новый объект будет указывать на один и тотже источник char ов , и последний вариант будет и первым и вторым

Добавлено через 5 минут
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
void main ()
{
    Student *mass[3];
 
 
        char* name = new char[20];
        int group, mark1[4], mark2[4];
        cout << "Vvedite informaciu o treh studentah (Imia, gruppa; Imia, gruppa, ocenki; Imia, gruppa, ocenki, ocenki.)" << endl;
        cin >> name >> group;
        mass[0] = new Student (group, name);
        name = new char[20];
        cin >> name >> group;
        for (int a=0; a<4; a++)
        {
            cin >> mark1[a];
        }
        mass[1] = new Student1 (group, name, mark1);
        cin >> name >> group;
        name = new char[20];
        for (int b=0; b<4; b++)
        {
            cin >> mark1[b];
        }
        for (int c=0; c<4; c++)
        {
            cin >> mark2[c];
        }
        mass[2] = new Student2 (group, name, mark1, mark2);
 
    for ( int i=0; i<3; i++)
    {
        mass[i]->Show();
    }
 
 
    getch();
}
и
C++
1
2
3
4
5
void Student2::Show() {
 
    Student::Show();
...
}
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 12:34  [ТС]     Виртуальные функции (создать массив указателей на объекты трех классов) #4
В том-то и дело, что цикл задан правильно. Но при попытке вывода показывает только имя и группу (верные имя и группу, соответствующие ожидаемым). Мне надо, чтобы функция для наследника выводила еще оценки и средний балл.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.12.2012, 12:39     Виртуальные функции (создать массив указателей на объекты трех классов) #5
Цитата Сообщение от absurd_logik Посмотреть сообщение
В том-то и дело, что цикл задан правильно. Но при попытке вывода показывает только имя и группу (верные имя и группу, соответствующие ожидаемым). Мне надо, чтобы функция для наследника выводила еще оценки и средний балл.
цикл ошибочный,и я объяснил почему, возьмите мой код функции main
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 12:43  [ТС]     Виртуальные функции (создать массив указателей на объекты трех классов) #6
Цитата Сообщение от Schizorb Посмотреть сообщение
C++
1
mass[i++] = &Student (group, name);
Так разве можно? У меня компилятор ругается на взятие адреса временного объекта.


C++
1
mass[i++] = new Student (group, name);
У меня не ругается. У вас visual studio?

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
цикл ошибочный,и я объяснил почему, возьмите мой код функции main
Вы путаете [i++] и [++i].
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.12.2012, 12:53     Виртуальные функции (создать массив указателей на объекты трех классов) #7
Цитата Сообщение от absurd_logik Посмотреть сообщение
У вас visual studio
нет, у меня gcc. И выводит прога для каждого класса свои данные, как я понял.

Код
Name: Sidorov
Group: 23
Name: Sidorov
Group: 22
Marks: 2 3 4 4
The average: 3.25
Marks: 4 5 6 3 5 4 3 3
The average: 4.125
Только name у всех совпадает, вам уже написал почему.
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 13:00  [ТС]     Виртуальные функции (создать массив указателей на объекты трех классов) #8
Цитата Сообщение от Schizorb Посмотреть сообщение
нет, у меня gcc. И выводит прога для каждого класса свои данные, как я понял.

Только name у всех совпадает, вам уже написал почему.
name у всех разное. Но кажется я начинаю понимать, как это сделать.

Добавлено через 3 минуты
Нет, все же не понимаю. У меня выводит разные(!) имена и группы, но оценки не выводятся вообще. Именно в них и проблема.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.12.2012, 13:14     Виртуальные функции (создать массив указателей на объекты трех классов) #9
Цитата Сообщение от absurd_logik Посмотреть сообщение
Вы путаете [i++] и [++i].
это вы ошибаетесь если думаете что это разные веши, очень страно что у вас разные имена, так как указателя на начало массива char у вас 1 для всех, не важно какой компилятор при вашем вызове у вас сразу вызывается деструктор объектов,подебажте
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.12.2012, 13:16     Виртуальные функции (создать массив указателей на объекты трех классов) #10
absurd_logik, вариант с динамическим выделением памяти с помощью new попробовали? результаты те же?
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 13:28  [ТС]     Виртуальные функции (создать массив указателей на объекты трех классов) #11
Schizorb, да. Выделял каждому указателю память под нужный класс. Но бесполезно. Вне массива метод работает, это я тоже проверял.

Добавлено через 3 минуты
Schizorb, да. Выделял каждому указателю память под нужный класс. Но бесполезно. Вне массива метод работает, это я тоже проверял.
Nixy, это разные вещи. ++i сперва увеличит число, а потом его использует, а i++ наоборот.

Добавлено через 2 минуты
Да и как же сразу вызывается деструктор, если программа работает?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.12.2012, 13:39     Виртуальные функции (создать массив указателей на объекты трех классов) #12
Цитата Сообщение от absurd_logik Посмотреть сообщение
Метод Show почему-то не переопределяется.
Мне казалось, что при перекрытии виртуального метода надо продублировать его прототип/заголовок в потомке.
absurd_logik
0 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 11
18.12.2012, 13:55  [ТС]     Виртуальные функции (создать массив указателей на объекты трех классов) #13
Цитата Сообщение от taras atavin Посмотреть сообщение
Мне казалось, что при перекрытии виртуального метода надо продублировать его прототип/заголовок в потомке.
Не уверен. В любом случае я это уже добавил в код.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Мне казалось, что при перекрытии виртуального метода надо продублировать его прототип/заголовок в потомке.
Погодите, так я же их переопределил. Я вас неправильно понял. Виртуальные методы наследуются.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.12.2012, 14:12     Виртуальные функции (создать массив указателей на объекты трех классов) #14
с моим коддом все работает, вы хоть пробовали дебагом пользоватся , или не понимаете о чем я?
почти правильно надо в последнем случае поменять местами строки 19 и 18 местами
Миниатюры
Виртуальные функции (создать массив указателей на объекты трех классов)  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 14:15     Виртуальные функции (создать массив указателей на объекты трех классов)
Еще ссылки по теме:

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++
Массив указателей на объекты C++
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции? C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.12.2012, 14:15     Виртуальные функции (создать массив указателей на объекты трех классов) #15
Цитата Сообщение от absurd_logik Посмотреть сообщение
Виртуальные методы наследуются.
Наследуется метод предка, при переопределении создаётся метод потомка с той же сигнатурой. Как он может наследоваться?
Yandex
Объявления
18.12.2012, 14:15     Виртуальные функции (создать массив указателей на объекты трех классов)
Ответ Создать тему
Опции темы

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