Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 457
Записей в блоге: 7
1

Интерфейсы в с++ дайте кто нибудь годный рабочий пример

31.10.2015, 22:56. Показов 3685. Ответов 9
Метки нет (Все метки)

Суть вопроса: нигде не могу найти рабочий пример использования интерфейсов, то есть когда есть интерфес, есть класс внутри длл-ки и всё это сообщается с клиентом (программой)
ну и надо чтоб в итоге работало.

Добавлено через 1 час 34 минуты
чет никто годноты не подкинет а тема судя по всему интересует многих, т.к уже не мало просмотров.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2015, 22:56
Ответы с готовыми решениями:

Дайте рабочий пример с робоспайсом пожалуйста
или какие библиотеки нужны для этого и где скачать спасибо ...

Дайте пожалуйста рабочий пример регулярного выражения c++
Мне нужно что-то типа AnsiString regexp = /<b>(.*)<\/b>/i; AnsiString str = "<b>Hello...

Дайте кто нибудь ссылку на видео Павел Чистов(управляемые формы)
Дайте кто нибудь ссылку на видео Павел Чистов(управляемые формы)

Двумерные массивы (напишите кто нибудь рабочий код, с меня пиво))
Опять я))) Блондинко))) Двумерные массивы (матрицы) 1. Дано число k (0 < k < 11) и матрица...

9
Don't worry, be happy
17276 / 10148 / 1964
Регистрация: 27.09.2012
Сообщений: 25,391
Записей в блоге: 1
31.10.2015, 23:01 2
Цитата Сообщение от Крюгер Посмотреть сообщение
нигде не могу найти рабочий пример использования интерфейсов, то есть когда есть интерфес, есть класс внутри длл-ки и всё это сообщается с клиентом (программой)
Дональд Бокс "Сущность технологии COM"
1
15381 / 8326 / 2017
Регистрация: 30.01.2014
Сообщений: 14,204
31.10.2015, 23:32 3
Лучший ответ Сообщение было отмечено Крюгер как решение

Решение

Цитата Сообщение от Крюгер Посмотреть сообщение
не могу найти рабочий пример использования интерфейсов
Это все довольно просто делается.
Вот, например, можно сделать аткой 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
#ifndef DLL_INTERFACE_H_
#define DLL_INTERFACE_H_
 
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
 
#ifdef __cplusplus
 
class ISomething
{
public:
    virtual int doSomething() = 0;
 
    virtual void release() = 0;
};
 
extern "C" DLL_API ISomething * createSomething();
 
namespace detail
{
 
struct isomething_release
{
    void operator()(ISomething * ptr) const
    {
        ptr->release();
    }
};
 
} // detail
 
#endif /* __cplusplus */
 
#endif /*DLL_INTERFACE_H_*/

К нему такой 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
#include "dll_interface.h"
 
#include <iostream>
 
class SomethingImpl
    : public ISomething
{
    /*virtual*/ void release()
    {
        std::cout << "do release" << std::endl;
        delete this;
    }
 
    /*virtual*/ int doSomething()
    {
        std::cout << "do Something" << std::endl;
        return 1;
    }
};
 
ISomething * createSomething()
{
    return new(std::nothrow) SomethingImpl();
}

Собрать из этого библиотеку (например в VS) с заданным глобальным макроопределением DLL_EXPORTS.
Потом можно создать тестовый проект (даже, например, используя другой компилятор), в котором подключить h-ник, динамически, либо на этапе компоновки подцепить dll-библиотеку.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <memory>
 
#include "dll_interface.h"
 
int main()
{
    using ismth_ptr = std::unique_ptr<ISomething, detail::isomething_release>;
 
    ismth_ptr iSmth(::createSomething());
 
    iSmth->doSomething();
}

Во вложении архив с двумя проектами. Dll сделана в VS 2013. Клиент - в CodeBlocks (mingw 4.9.2 c C++11).
Вложения
Тип файла: zip dll_interface.zip (13.4 Кб, 46 просмотров)
7
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
31.10.2015, 23:44 4
написал на скорую руку своеобразный интерфейс-контейнер и несколько реализаций:

Хедер самого интерфейса Container.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
#ifndef _CONTAINER_H
#define _CONTAINER_H
 
#ifdef CONTAINERDLL_EXPORTS
#define CONTAINERDLL_API __declspec(dllexport) 
#else
#define CONTAINERDLL_API __declspec(dllimport) 
#endif
 
class IContainer
{
public:
    //интерфейс контейнера
    virtual ~IContainer() {};
    virtual bool push(int) = 0;
    virtual bool pop(int&) = 0;
    virtual size_t count() const = 0;
    virtual bool find(int) const = 0;
    virtual bool clear() = 0;
    //функции фабрики
    static CONTAINERDLL_API IContainer* createList();
    static CONTAINERDLL_API IContainer* createStack();
    static CONTAINERDLL_API IContainer* createArray();
    //освобождение объекта
    static CONTAINERDLL_API void release(IContainer*);
};
 
#endif //_ICONTAINER_H

Реализация Container.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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#define CONTAINERDLL_EXPORTS
 
#include "Container.h"
#include <string.h>   //для memcpy()
 
class List : public IContainer
{
    struct Node
    {
        int data;
        Node* next;
        Node* prev;
    };
public:
    List() : _head(nullptr), _tail(nullptr), _count(0)
    {
    }
    virtual ~List()
    {
        clear();
    }
    bool push(int data) override
    {
        Node* new_node = new Node();
        new_node->data = data;
        new_node->next = nullptr;
        if (!_head) {
            new_node->prev = nullptr;
            _head = new_node;
        }
        else {
            _tail->next = new_node;
            new_node->prev = _tail;
        }
        _tail = new_node;
        ++_count;
        return true;
    }
    bool pop(int& data) override
    {
        if (!_head)
            return false;
        data = _tail->data;
        if (_head == _tail) {
            delete _head;
            _tail = nullptr;
            _head = nullptr;
        }
        else {
            Node* for_delete = _tail;
            _tail = _tail->prev;
            _tail->next = nullptr;
            delete for_delete;
        }
        --_count;
        return true;
    }
    virtual size_t count() const override
    {
        return _count;
    }
    virtual bool find(int data) const override
    {
        Node* tmp = _head;
        while (tmp) {
            if (tmp->data == data)
                return true;
            tmp = tmp->next;
        }
        return false;
    }
    virtual bool clear() override
    {
        Node* tmp = _tail;
        while (tmp != _head) {
            _tail = tmp->prev;
            delete tmp;
            tmp = _tail;
        }
        delete _head;
        _head = nullptr;
        _tail = nullptr;
        return true;
    }
private:
    Node* _head;
    Node* _tail;
    size_t _count;
};
 
class Stack : public IContainer
{
    struct Node
    {
        int data;
        Node* prev;
    };
public:
    Stack() : _tail(nullptr), _count(0)
    {
    }
    virtual ~Stack()
    {
        clear();
    }
    bool push(int data) override
    {
        Node* new_node = new Node();
        new_node->data = data;
        new_node->prev = _tail;
        _tail = new_node;
        ++_count;
        return true;
    }
    bool pop(int& data) override
    {
        if (!_tail)
            return false;
        data = _tail->data;
        Node* for_delete = _tail;
        _tail = _tail->prev;
        delete for_delete;
        --_count;
        return true;
    }
    virtual size_t count() const override
    {
        return _count;
    }
    virtual bool find(int data) const override
    {
        Node* tmp = _tail;
        while (tmp) {
            if (tmp->data == data)
                return true;
            tmp = tmp->prev;
        }
        return false;
    }
    virtual bool clear() override
    {
        Node* tmp = _tail;
        while (tmp) {
            _tail = _tail->prev;
            delete tmp;
            tmp = _tail;
        }
        _tail = nullptr;
        return true;
    }
private:
    Node* _tail;
    size_t _count;
};
 
class Array : public IContainer
{
    static const size_t size_step = 10;
public:
    Array() : _data(nullptr), _count(0)
    {
    }
    virtual ~Array()
    {
        clear();
    }
    bool push(int data) override
    {
        if (_count == _size) {
            _size = ((_count + 1) / size_step) * size_step;
            int* new_data = new int[_size];
            memcpy(new_data, _data, _count);
            delete _data;
            _data = new_data;
        }
        _data[_count++] = data;
        return true;
    }
    bool pop(int& data) override
    {
        if (0 == _count)
            return false;
        data = _data[--_count];
        return true;
    }
    virtual size_t count() const override
    {
        return _count;
    }
    virtual bool find(int data) const override
    {
        for (int i = 0; i < _count; ++i)
            if (_data[i] == data)
                return true;
        return false;
    }
    virtual bool clear() override
    {
        delete _data;
        _data = nullptr;
        _size = 0;
        _count = 0;
        return true;
    }
private:
    int* _data;
    size_t _count;
    size_t _size;
};
 
IContainer* IContainer::createList()
{
    return new List();
}
IContainer* IContainer::createStack()
{
    return new Stack();
}
IContainer* IContainer::createArray()
{
    return new Array();
}
void IContainer::release(IContainer* container)
{
    delete container;
}

Использование
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Container.h"
 
int main()
{
    IContainer* myContainer;
    myContainer = IContainer::createStack();
    myContainer->push(20);
    myContainer->push(10);
    myContainer->push(33);
 
    int data;
    myContainer->pop(data);
    IContainer::release(myContainer);
}
1
15381 / 8326 / 2017
Регистрация: 30.01.2014
Сообщений: 14,204
01.11.2015, 00:00 5
Operok, можно я немножко прокомментирую?
Фабричный метод в виде статической функции - это красивое решение, но в этой задаче вредное. Т.к. на эти функции будут подвержены name mangling`у, что помешает использовать такую dll из других компиляторов (отличных от того, которым собиралась dll).
Лучше их вынести из класса и сделать extern "C".
2
Don't worry, be happy
17276 / 10148 / 1964
Регистрация: 27.09.2012
Сообщений: 25,391
Записей в блоге: 1
01.11.2015, 00:02 6
Цитата Сообщение от DrOffset Посмотреть сообщение
что помешает использовать такую dll из других компиляторов (отличных от того, которым собиралась dll).
Лучше их вынести из класса и сделать extern "C".
виртуальный деструктор тоже повлияет
1
15381 / 8326 / 2017
Регистрация: 30.01.2014
Сообщений: 14,204
01.11.2015, 00:03 7
Цитата Сообщение от Croessmah Посмотреть сообщение
виртуальный деструктор тоже повлияет
Да. Согласен.
Именно поэтому у меня была сделана функция release вместо него
1
Don't worry, be happy
17276 / 10148 / 1964
Регистрация: 27.09.2012
Сообщений: 25,391
Записей в блоге: 1
01.11.2015, 00:06 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Именно поэтому у меня была сделана функция release вместо него
у ТС и деструктор и release, поэтому упомянул
1
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 457
Записей в блоге: 7
01.11.2015, 00:54  [ТС] 9
всем спасибо ) буду разбираться
0
43 / 142 / 31
Регистрация: 29.06.2019
Сообщений: 1,413
16.12.2020, 18:13 10
Цитата Сообщение от DrOffset Посмотреть сообщение
Фабричный метод в виде статической функции - это красивое решение, но в этой задаче вредное.
вот это пока единственный смысл фабрик, который вижу... когда есть только доступ к интерфейсу (например, в dll), а реализация зашита внутрь = поэтому нет доступа к конструктору класса... вот тут фабрика в помощь, создавая указатель на instance...
конечно, если в перспективе намечается желание закинуть всё в dll - то, наверно, есть смысл сразу делать по науке (разворачивать фабрику), чтобы зашивать в dll потом легко было...
а иначе прикладных аспектов фабрик пока больше не вижу, кроме таких же ситуаций в run-time'e, когда имеем доступ к интерфейсу или абтрактному классу, а реализация отделена от него...
Спасибо, за полезный пример, а не штампование фабрик без причины...
причина всегда должна быть для каждой строки кода и паттернов в том числе
0
16.12.2020, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2020, 18:13

Скиньте кто-нибудь пример тех. задания (ТЗ)
Я начинающий программер в 1С... Дали задание прихреначить готовую конфигурацию к веб-расширению от...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru