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

Виртуальные абстрактные базовые классы - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Анонимные каналы http://www.cyberforum.ru/cpp-beginners/thread802793.html
Доброго времени суток! Пожалуйста, помогите написать следующую программу: Разработать три программы – сервер, создающий анонимный канал, и два клиента, обменивающиеся данными по анонимному каналу. Первый клиент запрашивает у пользователя беззнаковое целое число и отсылает второму клиенту. Второй клиент принимает число. Если оно является степенью двойки, то отправляет первому клиенту показатель...
C++ Почему нельзя использовать в операторе case переменные, которые определены как #define Я не понимаю, почему Visual Studio ругается на строку с case в коде. Вроде все правильно. Если там написать напрямую цифру, тогда все компилируется. А если же там написать строку, которая обозначает тоже самое число (так как выше определена под #define), тогда компилятор ругается на одно место аж три раза: Error 1 error C2143: syntax error : missing ':' before... http://www.cyberforum.ru/cpp-beginners/thread802779.html
Хочу изучить C++ C++
Начал читать книгу С++ на начинающих можно сказать чайников. Не могу скомпилировать. Хотел бы найти знающего человека ля помощи и дальнейшего общения. Кто сможет помочь оставьте эмайл или номер аськи, скайп. Спасибо=)
Компиляция заданного кода в exe через программу C++
Хочу узнать поподробнее, как реализовать компиляцию некого заданного кода в exe для windows через самописную программу. Ведь как-то писали компиляторы для других ЯП-ов. Например, есть код (предположим, паскалеподобный): begin print'HELLO!' exit Мне нужно, чтобы через мою прогу он переводился (компилировался) в exe-файл, который запускался бы через windows и выполнял то, что написано в...
C++ Дан массив состоящий из n натуральных чисел http://www.cyberforum.ru/cpp-beginners/thread802718.html
Дан массив состоящий из n натуральных чисел.Образовать новый массив элементам которого будут элементы исходного оканчивающиеся на цифру k
C++ Задан массив с количеством элементов n Задан массив с количеством элементов n.Сформировать 2 массива:в 1 включить элементы исходного массива с чётными номерами,а во 2 с нечётными подробнее

Показать сообщение отдельно
Lopster92
3 / 3 / 0
Регистрация: 25.12.2009
Сообщений: 49
07.03.2013, 16:33     Виртуальные абстрактные базовые классы
Привет всем!:-) Вчера столкнулся со следующей проблемой: компилятор ругается на чистый виртуальный деструктор. Собственно листинги:

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
//workermi.h
#ifndef WORKERMI_H_
#define WORKERMI_H_
 
#include <iostream>
#include <string>
 
//abstract base class
class Worker {
private:
    std::string fullname;
    long id;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Worker() : fullname("no one"), id(0L) { }
    Worker(const std::string & s, long i) : fullname(s), id(i) { }
    //~Worker();
    virtual ~Worker() = 0;
    virtual void Set() = 0;         // cleanly virtual function
    virtual void Show() const = 0;
};
 
class Waiter : virtual public Worker {
private:
    int panache;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Waiter() : Worker(), panache(0) { }
    Waiter(const std::string & s, long i, int p = 0) :
        Worker(s, i), panache(p) { }
    Waiter(const Worker & wk, int p = 0) :
        Worker(wk), panache(p) { }
    //~Waiter();
    void Set();
    void Show() const;
};
 
class Singer : virtual public Worker {
protected:
    enum { other, alto, contralto, soprano, bass,
            baritone, tenor };
    enum { Vtypes = 7 };
    virtual void Data() const;
    virtual void Get();
private:
    static char *pv [Vtypes];
    int voice;
public:
    Singer() : Worker(), voice(other) { }
    Singer(const std::string & s, long i, int v = other) :
        Worker(s, i), voice(v) { }
    Singer(const Worker & wk, int v = other) :
        Worker(wk), voice(v) { }
    //~Singer();
    void Set();
    void Show() const;
};
 
class SingingWaiter: public Waiter, public Singer {
protected:
    void Data() const;
    void Get();
public:
    SingingWaiter() { }
    SingingWaiter(const std::string & s, long i, int p = 0, int v = other) :
        Worker(s, i), Waiter(s, i, p), Singer(s, i, v) { }
    SingingWaiter(const Worker & wk, long i = 0, int v = other) :
        Worker(wk), Waiter(wk, i), Singer(wk, v) { }
    SingingWaiter(const Waiter & wt, int v = other) :
        Worker(wt), Waiter(wt), Singer(wt, v) { }
    SingingWaiter(const Singer & sg, long i = 0) :
        Worker(sg), Waiter(sg, i), Singer(sg) { }
    //~SingingWaiter();
    void Set();
    void Show() const;
};
 
#endif /* WORKERMI_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
//workermi.cpp
#include "workermi.h"
 
//============================================= Worker
void Worker::Data() const {
    std::cout << "Name:" << fullname << std::endl;
    std::cout << "ID: " << id << std::endl;
}
 
void Worker::Get() {
    std::getline(std::cin, fullname);
    std::cout << "Enter ID of the worker: ";
    std::cin >> id;
    while(std::cin.get() != '\n')
        continue;
}
 
//============================================= Waiter
void Waiter::Data() const {
    std::cout << "Panache index: " << panache << std::endl;
}
 
void Waiter::Get() {
    std::cout << "Enter the Panache index: ";
    std::cin >> panache;
    while(std::cin.get() != '\n')
        continue;
}
 
void Waiter::Set() {
    std::cout << "Enter first and second name of the Waiter: ";
    Worker::Get();
    Get();
}
 
void Waiter::Show() const {
    std::cout << "The Waiter category\n";
    Worker::Data();
    Data();
}
 
//============================================= Singer
char * Singer::pv [Singer::Vtypes] = { "other", "alto", "contralto",
        "soprano", "bass", "baritone", "tenor"};
 
void Singer::Data() const {
    std::cout << "Vocal range: " << pv[voice] << std::endl;
}
 
void Singer::Get() {
    std::cout << "Enter vocal range value of the singer: " << std::endl;
    int i;
    for(i = 0; i < Vtypes; i++) {
        std::cout << i << ": " << pv[i] << " ";
        if (i % 4 == 3)
            std::cout << std::endl;
    }
    if (i%4 != 0)
        std::cout << '\n';
    std::cin >> voice;
    while(std::cin.get() != '\n')
        continue;
}
 
void Singer::Set() {
    std::cout << "Enter first and second name of the Singer: ";
    Worker::Get();
    Get();
}
 
void Singer::Show() const {
    std::cout << "The Singer category\n";
    Worker::Data();
    Data();
}
 
//============================================= SingingWaiter
 
void SingingWaiter::Data() const {
    Waiter::Data();
    Singer::Data();
}
void SingingWaiter::Get() {
    Waiter::Get();
    Singer::Get();
}
 
void SingingWaiter::Set() {
    std::cout << "Enter first and second name of the Singer: ";
    Worker::Get();
    Get();
}
 
void SingingWaiter::Show() const {
    std::cout << "The SingingWaiter category\n";
    Worker::Data();
    Data();
}
C++
1
2
3
4
5
6
7
8
//QueWorMain.h
#include <iostream>
#include "workermi.h"
 
int main() {
    std::cout << "Hello" << std::endl;
    return 0;
}
Вот что выстреливает консоль...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Console
Building target: Prta_G14_zL3
Invoking: Cross G++ Linker
g++  -o "Prta_G14_zL3"  ./QueWorMain.o ./bank.o ./queue.o ./workermi.o   
./workermi.o: In function `~Waiter':
/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:24: undefined reference to `Worker::~Worker()'
/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:24: undefined reference to `Worker::~Worker()'
./workermi.o: In function `~Singer':
/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:41: undefined reference to `Worker::~Worker()'
/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:41: undefined reference to `Worker::~Worker()'
./workermi.o: In function `~SingingWaiter':
/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:62: undefined reference to `Worker::~Worker()'
./workermi.o:/home/farik/Prog/Workspace/Prta_G14_zL3/Debug/../workermi.h:62: more undefined references to `Worker::~Worker()' follow
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [Prta_G14_zL3] Ошибка 1
Каждый деструктор полюбому обращается к Worker::~Worker(). Поэтому я так понял, что ошибка именно в нем. Изменил определение virtual ~Worker() = 0; на ~Worker();. Тогда работает... Но вить при наследовании деструкторы обязательно должны быть виртуальными!?!?!

Также есть сомнение на счет того, что в классе SingingWaiter должно быть 2 объекта Worker, но используя ВИРТУАЛЬНЫЕ КЛАССЫ мы решаем проблему, в связи с чем, в конструкторе SingingWaiter явно указываем каким образом инициализировать объект Worker... Но вот с деструктором че будет непонятно???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru