Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147

Классы и работу с ними

11.12.2013, 14:55. Показов 726. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю лабы и сдаю. Но увы не понимаю всего потому вопрос.
Допустим есть некий класс Base и его наследник Production. Класс Base описывает некий объект (характеристики объекта) и функции доступа к ним. Класс Production описывает функции для работы с Base.
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
class Base 
{
private:
    int characteristic_one;
    int characteristic_two;
    int characteristic_three;
public:
    int get_one(int n) {
        characteristic_one = n;
        return characteristic_one;
    }
 
    int get_two(int n) {
        characteristic_two = n;
        return characteristic_two;
    }
 
    char *get_three(char *n) {
        strcpy(characteristic_three, n);
        return characteristic_three;
    }
 
};
 
class Production : public Base
{
    void func() {
        //...
    }
};
И вот я не могу понять , что требуется для вызова func() в main(). В некоторых лабах такие функции я вызывал предварительно вызвав конструктор , базового или производного класса с некой st - Base st(3,1,1); а затем и функцию st.func();
В лабе с шаблонными классами у меня получилось func() вызывать когда в базовом классе был указатель ( в том случае на очередь ) и через него , с использованием точки саму функцию.
C++
1
2
3
4
5
6
7
8
9
template <class T> class Base {
T *arr;
public:
//...
};
 
int main () {
arr.func();
}
Но в общем я не въехал, что все это и за счет чего вызывается. Из за всего этого непонимания приходиться долго мучатся. И ужасно хочется все это понять. Поясните что нибудь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2013, 14:55
Ответы с готовыми решениями:

Классы (Описать класс, реализующий тип данных «вещественная матрица» и работу с ними)
само задание звучит так:Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие...

Наследование. Классы. Перегрузка '=' и иже с ними
Всем доброго самого. Вопрос для уточнения. Есть класс: class A { public: A &amp; operator = (const...

Задача на считывание данных и работу с ними
Привет, друзья! Помоги одну вещь сделать. Буду очень благодарен за любую помощь. Мне надо считать данные с файла (во вложении). В нём...

9
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
11.12.2013, 15:03
Не совсем понял с чем у вас затруднение
Приведу пример
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
#include <iostream>
 
class A
{
      private:
              int var;
      public:
             A(int _var = 0) : var(_var){}
             int getVar(){ return var; }
};
 
class B : public A
{
      private:
              int otherVar;
      public:
             B(int _other = 0, int _var) : A(_var), otherVar(_other){}
             int getOtherVar(){ return otherVar;}
};
 
 int main()
 {
    
    B b(10,5);
    std::cout << b.getVar() << std::endl; //унаследованный метод от класса А
    std::cout << b.getOtherVar() << std::endl;//свой метод класса В
    
     system("PAUSE");
     return 0;
 }
0
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147
11.12.2013, 15:09  [ТС]
Цитата Сообщение от egor2116 Посмотреть сообщение
Не совсем понял с чем у вас затруднение
C++
1
2
3
4
5
6
7
8
9
10
int main()
 {
    
    B b(10,5);
    std::cout << b.getVar() << std::endl; //унаследованный метод от класса А
    std::cout << b.getOtherVar() << std::endl;//свой метод класса В
    
     system("PAUSE");
     return 0;
 }
Проблема именно в том что я не понимаю что есть b тут -> B b(10,5);
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
11.12.2013, 15:16
Проблема именно в том что я не понимаю что есть b
b - это обьект класса В. Другими словами класс В - это чертеж, а b - это конкретное изделие сделанное по этому чертежу.
1
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147
11.12.2013, 15:26  [ТС]
Цитата Сообщение от egor2116 Посмотреть сообщение
b - это обьект класса В. Другими словами класс В - это чертеж, а b - это конкретное изделие сделанное по этому чертежу.
То есть получается что объект объект объявляется при вызове конструктора? и в зависимости от принадлежности объекта к какому либо классу вызывается соответствующий конструктор. Получается для базового класса объект создавался бы и вызывался так - A a(5);
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
11.12.2013, 15:29
То есть получается что объект объект объявляется при вызове конструктора? и в зависимости от принадлежности объекта к какому либо классу вызывается соответствующий конструктор. Получается для базового класса объект создавался бы и вызывался так - A a(5);
Совершенно верно.
только не
объявляется
а создается.
Конструктор класса создает обьект этого класса.
Деструктор уничтожает обьект.
0
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147
11.12.2013, 16:21  [ТС]
Цитата Сообщение от egor2116 Посмотреть сообщение
Совершенно верно.
только не а создается.
Конструктор класса создает обьект этого класса.
Деструктор уничтожает обьект.
Ну я просто ошибся пока обдумывал. значит в шаблонах template <class тип> ... . Тип это у нас и есть объект. А то что я про указатель говорил тоже. Но объект у нас можно объявить в классе? Типо так
C++
1
2
3
4
class A
{
//...
}a;
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
11.12.2013, 16:41
значит в шаблонах template <class тип> ... . Тип это у нас и есть объект
Нет.
Слово класс в шаблоне это просто служебное слово(в место слова class можно использовать typename). Тип - это именно тип данного
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
template<class T>
class A
{
   private:
            T a;
   public:
           A(T _a) : a(_a){}
           T getA(){ return a; }
};
int  main()
{
       A<int> a(10); //int это и есть "Тип" указанный в tamplate<class "ТИП">
       std::cout << a.getA();
 
       return 0;
}
Но объект у нас можно объявить в классе? Типо так
Обьект в классе это -

C++
1
2
3
4
5
6
class A{};
class B
{
   private:
             A a;///вот это обьект в классе
};

а это
C++
1
2
3
4
class A
{
//...
}a;
Ты просто создаешь обьект "а" класса "А". Так делать можно(опять ты про обьявление - создание),
но редко когда удобно или нужно.

А то что я про указатель говорил тоже.
А что конкретно, напомни.
0
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147
11.12.2013, 16:59  [ТС]
Цитата Сообщение от egor2116 Посмотреть сообщение
А что конкретно, напомни.
Вот на днях написал. И здесь я как то сделал, но не понял толком как. Вот тут у меня обращение queue.func(). А queue это указатель. Я не мог понять на что. А теперь как я понял это просто указатель на родовой тип.
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
#include <iostream>
using namespace std;
 
template < class T > class Queue //Шаблонный класс описывающий очередь.
{
protected:
    T *queue; //Указатель на очередь.
    int size; //Начало очереди.
    int tail; //Конец очереди.
public:
    Queue(int n) { //Конструктор.
        size = 0; //Начало = 0.
        tail = n; //Конец = n.
        queue = new T[n]; //Выделение памяти под очередь размером n.
        cout << "Сработал конструктор\n";
        cout << "Создана очередь размером = " << n << "" << endl;
    }
 
    ~Queue() { //Деструктор
        delete []queue; //Удаление очереди.
        cout << "Сработал деструктор\n";
    }
};
 
template < class T > class Node : public Queue<T> //Контейнерный шаблонный класс операций над очередью.
{
public:
    Node( int n ) : Queue<T> ( n ) {} //Создаём очередь.
    void add_item() { //Функция добавление элемента в очередь.  
        T in;
        if( size < tail) { //Если очередь не полна.
            cin >> in; //Вводим элемент очереди.
            int max_size = tail; //Переменная равна концу очереди.
            queue[size] = in; //Добавление элемента в начало.
            size++; 
        }
        else { //Если очередь полна.
            int i = 1;
            cout << "Очередь заполнена\nВведите новый элемент -> ";
            for(; i < tail; i++) { //Если очередь полная, происходит сдвиг.
                queue[i-1] = queue[i];
            }
            cin >> in; //Добавление нового элемента в конец очереди.
            queue[i-1] = in;
        }
        cout << "Очередь -> ";
 
        for(int i = 0; i < size; i++) { //Цикл вывода очереди на экран.
            cout << queue[i] << " ";
        }
 
    cout << "\n";
    }
 
    void find_item() { //Функция поиска элемента
        if (size == 0) { //Если очередь пуста.
            cout << "Очередь пуста\n";
        }
        else { //Если в очереди что то есть.
            T in;
            cin >> in; //Ввод элемента поиска.
            for(int i = 0; i < tail; i++) { //Цикл поочередной проверки элементов очериди на совпадение с введенным.
                if(in == queue[i]) { //Если введенный элемент есть в очереди.
                    cout << "Номер элемента: " << i+1 << " это " << in;
                }
            }
        }
        cout << endl;
    } 
};
 
int check_int() //Функция проверки ввода(исключительная ситлуация)
{
    int i, flag = 0;
    char ch[10];
    cin >> i;
    flag = cin.rdstate(); //Функция-член rdstate() позволяет получить текущее состояние объекта
    if (flag& ios :: failbit) { //Если введена буква.
        cin.clear(); //Сброс текущего состояния и установки одного или нескольких флагов нового
        cin >> ch;
        throw 1; //Ключевое слово, "создающее" ("возбуждающее") исключение.
    }
    return i;
}
 
int main()
{
    setlocale (LC_ALL, "Russian");
        int index_size = 0; //Рабочая переменная
 
        int flag = 0;
        do
        {
            try { //Начало блока исключений.
                flag = 0;
                cout << "Введите размер очереди: ";
                index_size = check_int(); //Проверка вводимого символа.
            }
            catch(int) { //Начало блока, "ловящего" исключение.
                flag = 1;
                cout << "Ошибка ввода!\n";
            }
         }
        while(flag == 1);
 
        Node<int> queue(index_size);
 
        cout << "Введите очередь.\n";
        for(int k=0, s; k < index_size; k++) {
            queue.add_item();//добавление элемента очереди
            if(k+1 == index_size) {
                l:
                cout << "Добавить элементы?\n1. Да.\n2. Нет.\n";
                cin >> s;
                switch(s) {
                    case 1: { queue.add_item(); goto l;}
                    case 2: break;
                    default: { cout << "Введите правильно\n"; goto l;}
                }
            }
        }
    cout << "Поиск элемента.\nКакой элемент найти?\nЭлемент -> ";
    queue.find_item();
    system("pause");
    return 0;
}
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
12.12.2013, 10:04
1. У вас неправильное наследование Узел не является Очередью, наоборот Очередь должна содержать Узлы.
2. Node<int> queue(index_size); Это не указатель, а просто обьект класса.
Обращение к указателю:
C++
1
2
A * a = new A;
a->func();
но можно и через точку, но для этого нужно раз именовать указатель:
C++
1
2
A * a = new A;
(*a).func();
Добавлено через 4 минуты
Примерный интерфейс очереди:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T>
struct Node
{
    T  value;
     Node * next;
}
 
template<class T>
class Queue
{
     private:
                Node * first;
                Node * end;
                //или на массиве
                T * arr;
                size_t SIZE;
     public:
               void add(T val);
               void print();
               //и так далее
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2013, 10:04
Помогаю со студенческими работами здесь

Bootstrap. Классы pull и push. Что с ними не так?
пример показать не представляется возможным, поэтому постараюсь разъяснить на пальцах. &lt;div class=&quot;container&quot;&gt; ...

Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Доброго времени суток, необходима помощь в написании программы. Описать класс, реализующий тип данных «вещественная матрица» и работу...

Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над...

Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Помогите пожалуйста, сделать лабу :cry: Лабораторная работа 8. Классы и операции Каждый разрабатываемый класс должен, как правило,...

Описать класс, реализующий тип данных «вещественная матрица» и работу с ними
Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru