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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
irises
69 / 26 / 8
Регистрация: 29.06.2015
Сообщений: 104
#1

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++

31.07.2015, 23:58. Просмотров 2684. Ответов 131
Метки нет (Все метки)

Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит
указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck).
eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия.
Вопрос: как через указатель четвертого класса доступится к наследующим классам?
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
class aGasStation
{
    friend class bCar;
    friend class cTruck;
protected :
    double A92;
    double A95;
    double A98;
    int cistern92;
    int cistern95;
    int cistern98;
public:
    aGasStation ();
    ~aGasStation ();
    virtual void print () = 0;
};
 
class bCar : public aGasStation
{
    eFuel fuelcar;
public:
    bCar ();
    ~bCar ();
    void print ();
};
 
class cTruck  : public aGasStation
{
    eFuel fueltruck;
public:
    cTruck ();
    ~cTruck ();
    void print ();
};
 
class dChainOfGasStation
{
    aGasStation *base;
    double money;
    static int size;
public:
    dChainOfGasStation ();
    ~dChainOfGasStation ();
    friend void buildCar (dChainOfGasStation *tmp);
    friend void buildTruck (dChainOfGasStation *tmp);
};
C++
1
2
3
4
5
6
7
8
void main ()
{
    dChainOfGasStation base;
    buildCar (&base);
    buildCar (&base);
    buildTruck (&base);
    buildCar (&base);   
}
Пытаюсь таким способом в main(), но знаю что base[0] - это private, а сделать его public противоречит правилам С++
C++
1
base.base[0]->print();
Можно написать set-метод, но каким образом это сделать я не знаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 23:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как обратится к обьекту класса, являющегося наследником абстрактного класса (C++):

как узнать,является данный объект класса А1 наследником класса А2 - C++
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая S - Является родителем для всех классов и он имеет...

Как полю класса А обратится к приватной функции класса А? - C++
Есть лифт (класс "Elevator "), в котором находится кнопка (класс "Button"). При нажатии на кнопку (функция "push") должен пойти сигнал в...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Как инициализировать члены класса, являющегося параметром шаблона - C++
#include <iostream> #include <conio.h> using namespace std; template <typename SomeClass> class Array { private : ...

Как организовать интерфейс в виде абстрактного класса? - C++
У меня есть задание, вот его часть: - расчёты движения предмета должны осуществляться в библиотеке, для которой нужно создать интерфейс...

Использование конструктора базового класса наследником - C++
Доброго дня, коллеги! Решал одну задачку и столкнулся с проблемой. По условию дан класс String, моделирующий работу типа данных string....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
01.08.2015, 15:33 #76
Цитата Сообщение от Avazart Посмотреть сообщение
Я чет не понял что пример демонстрирует то?
Там все написано.
Демонстрирует то, зачем вообще нужен friend. Это альтернативный способ организации интерфейса. Когда мы пишем метод в классе, то почему у нас не возникает желания оставить ему в пользование только часть данных? Сказать: метод x класса А имеет право доступа только к данным а и b класса А, но к данным c и d - не имеет.
Пример демонстрирует, что для friend правила такие же как для членов класса. Точно так же как не существует подобного ограничения для членов класса, не существует его и для friend.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,574
Записей в блоге: 17
01.08.2015, 15:33 #77
C++
1
2
3
4
5
 class sample 
{ 
       sample(); 
       friend some::hardcore(); 
}
А если так?
Я не узнаю пока не полезу в hardcore() где увижу что в hardcore() где возможно вызываются закрытые методы и мне опять нужно будет вернуться к классу sample
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
01.08.2015, 15:35 #78
Цитата Сообщение от Avazart Посмотреть сообщение
А если так?
а если так?

C++
1
2
3
4
5
6
7
8
9
class ffsdf
{ 
       ffsdf(); 
       friend ffsdf tyltry(); 
 
int    dfkdflgk;
 
     float dgklhg(int gfg);
};
мож не нужно доводить до маразма?
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,574
Записей в блоге: 17
01.08.2015, 15:44 #79
Цитата Сообщение от hoggy Посмотреть сообщение
мож не нужно доводить до маразма?
А при чем тут маразм? Дело то не ограничиватеся только созданием(make) могу выполнятся и другие действия.
hardcore() вполне может быть вменяемым названием, но ее имя не скажет точно с чем из защиенных внутренностей данного класса она работает, для этого мне придется листать код к её определению. Т.е менее информативно.
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
01.08.2015, 15:56 #80
Цитата Сообщение от Avazart Посмотреть сообщение
А при чем тут маразм? Дело то не ограничиватеся созданием(make) могу выполнятся и другие действия.
1.
пользователя не касается, что там под капотом чужого класса.

2.
разработчик знает, что под капотом его собственного класса.

3.
если функция называется "создавалка", но на деле - "прибивалка",
то у такого кода проблемы посерьезнее,
нежели "отсутствие инкапсуляции от себя самого".

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
hardcore() вполне может быть вменяемым названием, но ее имя не скажет точно с чем из защиенных внутренностей данного класса она работает,
имя функции-члена должно отражать умение механизма.
hardcore в сферическом ваккуме мне ни о чем не говорит, например.

имя не должно никак светить подробности реализации.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,574
Записей в блоге: 17
01.08.2015, 16:01 #81
Цитата Сообщение от DrOffset Посмотреть сообщение
Здесь нет нарушения инкапсуляции, есть другой подход к организации интерфейса.
Естественно нет, ибо один класс не лезит в другой...
Да и по сути, что это код делает?
К примеру чем тут конструктор не устроил?

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
1.
пользователя не касается, что там под капотом чужого класса.
Цитата Сообщение от hoggy Посмотреть сообщение
2.
разработчик знает, что под капотом его собственного класса.
Ну.. ну... пользователь это разработчик спустя несколько месяцев .... когда все уже подзабылось.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
имя не должно никак светить подробности реализации.
Имя нет, о чем я и пытался сказать, а вот "фриенд-объявление" неплохо бы что бы говорило, точнее сказать что давало больше информации об "отношениях" к этому классу.
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
01.08.2015, 16:06 #82
Цитата Сообщение от Avazart Посмотреть сообщение
Ну.. ну... пользователь это разработчик спустя несколько месяцев .... когда все уже подзабылось.
ну и что?

если разраб через полгода собственный код вразуметь не в состоянии - ну его трудности.
значит такой разраб.

"пьяный проспится, дурак - никогда"(ц)Петр 1.


и кстати, чем меньше всякой ботвы, тем проще код.
когда я читаю чужой код,
я смотрю на то, что код делает по факту.
а не на то, чего он мог бы сделать,
или не мог.

Добавлено через 56 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
Имя нет, о чем я и пытался сказать, а вот "фриенд-объявление" неплохо бы что бы говорило, точнее сказать что давало больше информации об "отношениях" к этому классу.
если вы считаете, что имя не достаточно понятное - ну дайте более понятное.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
01.08.2015, 16:22 #83
Цитата Сообщение от Avazart Посмотреть сообщение
Да и по сути, что это код делает?
К примеру чем тут конструктор не устроил?
Это демонстрационный пример. Детали не играют роли, главное там - это строки 9 и 16, которые демонстрируют ноль отличий, с точки зрения доступа к данным класса.

А вообще есть разные варианты применения такого. Когда конструктор спрятан, чтобы кто попало не мог создать объект. Это как раз пример усиления инкапсуляции, путем накладывания дополнительных ограничений. Ты же сам с подобного примера и начал. В любом случае, без конкретной задачи целесообразность подобного обсуждать бессмысленно. В С++ есть много идиом, которые без упоминания конкретной задачи могут показаться бредом.

PS. Вообще, если интересно, демонстрационный пример использовал в основе эту идиому: https://en.wikibooks.org/wiki/More_C...ed_Constructor
Однако это напрямую не относится к обсуждаемому вопросу.
smartpointer
67 / 61 / 23
Регистрация: 17.02.2014
Сообщений: 256
01.08.2015, 16:48 #84
Цитата Сообщение от DrOffset Посмотреть сообщение
class Base {};
class C : public Base
{
public:
* * friend std::unique_ptr<C> create();
private:
* * C() {}
int v;
};
std::unique_ptr<C> create()
{
* * std::unique_ptr<C> x(new C());
* * x->v = 10;
* * return x;
}
Это называется как загнать себя в угол с инкапсуляцией.По идеи пример не имеет право на жизнь. Потому как я не смогу сделать вот так.
C++
1
2
3
4
5
6
7
8
class D : public C
{
};
int main()
{
    D d;
    return 0;
}
Класс C сам должен быть инкапсулирован . Чтобы юзер не смог вообще его видеть.Или нам нужно решение в виде костылей ?
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
01.08.2015, 17:02 #85
Цитата Сообщение от smartpointer Посмотреть сообщение
Это называется как загнать себя в угол с инкапсуляцией.По идеи пример не имеет право на жизнь. Потому как я не смогу сделать вот так.
Цитата Сообщение от smartpointer Посмотреть сообщение
Класс C сам должен быть инкапсулирован . Чтобы юзер не смог вообще его видеть.Или нам нужно решение в виде костылей ?
сложно предполагать, что вы понимаете под инкапсуляцией.
но в голове у вас конкретная каша.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,574
Записей в блоге: 17
01.08.2015, 17:07 #86
Цитата Сообщение от DrOffset Посмотреть сообщение
Это демонстрационный пример. Детали не играют роли, главное там - это строки 9 и 16, которые демонстрируют ноль отличий, с точки зрения доступа к данным класса.
Да как раз дьявал в деталях.

Цитата Сообщение от DrOffset Посмотреть сообщение
В С++ есть много идиом, которые без упоминания конкретной задачи могут показаться бредом.
А я о чем... твой код бред .. непонятно что делает, для чего и как.
Класс Base пустой.... явно чего то нехватает...

Цитата Сообщение от hoggy Посмотреть сообщение
и кстати, чем меньше всякой ботвы, тем проще код.
Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
и кстати, чем меньше всякой ботвы, тем проще код.
Добро пожаловать в Си и Asm там все просто...

Добавлено через 48 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
я смотрю на то, что код делает по факту.
а не на то, чего он мог бы сделать,
или не мог.
Ну вот и я про то нужно смотреть, не интуитивно...

Добавлено через 45 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
если вы считаете, что имя не достаточно понятное - ну дайте более понятное.
Так а я о чем нет таких средств в С++.
smartpointer
67 / 61 / 23
Регистрация: 17.02.2014
Сообщений: 256
01.08.2015, 17:17 #87
Цитата Сообщение от hoggy Посмотреть сообщение
сложно предполагать, что вы понимаете под инкапсуляцией.
Так же как и вы. Тык или не ?
Цитата Сообщение от hoggy Посмотреть сообщение
но в голове у вас конкретная каша.
Ну так приведите контр-пример или типа классы не могут быть скрытыми ?
P.S меньше читайте всяких умников - больше пишите кода, иначе только забьете голову всяким бредом так и не научившись кодить
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
01.08.2015, 17:31 #88
Цитата Сообщение от Avazart Посмотреть сообщение
Добро пожаловать в Си и Asm там все просто...
мне и на плюсах не плохо.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну вот и я про то нужно смотреть, не интуитивно...
если вам понадобилось смотреть потроха класса,
значит вы в любом случае будете это делать.

насколько там понятный будет код,
зависит от квалификации автора.

ничто не мешает писать понятный код.

откуда у вас такая нужда возникла,
это вопрос отдельный, и открытый.

явно не из-за декларации в приватной части класса некого френда.

Цитата Сообщение от Avazart Посмотреть сообщение
Так а я о чем нет таких средств в С++.
существующих возможностей языка выше крыше,
для написания понятного кода.

Цитата Сообщение от smartpointer Посмотреть сообщение
Так же как и вы. Тык или не ?
похоже, что не.

Цитата Сообщение от smartpointer Посмотреть сообщение
Ну так приведите контр-пример или типа классы не могут быть скрытыми ?
1.
Инкапсуляция данных - это не сокрытие данных.

2.
в примере выше у класса был закрыт конструктор.
автор этого кода сделал это специально.

ваша реакция на это показывает,
что вы не осознаете сути момента.

в частности:
Цитата Сообщение от smartpointer Посмотреть сообщение
Потому как я не смогу сделать вот так.
вот именно для этого конструктор и был сознательно закрыт его создателем.

что бы такие как вы,
которые не в теме,
не смогли отстрелить себе ноги.

Добавлено через 1 минуту
Цитата Сообщение от smartpointer Посмотреть сообщение
P.S меньше читайте всяких умников - больше пишите кода, иначе только забьете голову всяким бредом так и не научившись кодить
спасибо за заботу.
правда я уже староват для таких советов.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
01.08.2015, 17:47 #89
Цитата Сообщение от Avazart Посмотреть сообщение
А я о чем... твой код бред .. непонятно что делает, для чего и как.
Класс Base пустой.... явно чего то нехватает...
Ну добавь туда что-нибудь
А вообще, все уже было сказано, повторяться не буду. Читай еще раз сначала.

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
Это называется как загнать себя в угол с инкапсуляцией.
Нет, это называется ограничение на использование. Когда класс запрещают копировать - делают это по той же причине. Ограничивают использование. А нужно это оказалось настолько, что в новой редакции языка добавили возможность делать это из коробки.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,574
Записей в блоге: 17
01.08.2015, 17:59 #90
Цитата Сообщение от DrOffset Посмотреть сообщение
Читай еще раз сначала.
Да я код читаю, из него ничего не понять что вы хотели продемонстировать... пример фиг знает чего, ради не знаю чего.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
существующих возможностей языка выше крыше,
для написания понятного кода.
Ок, тогда насколько понятен этот код? И можно его улучшить/переписать/сделать понятнее?

Вспомогательное
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
#include <QCoreApplication>
#include <algorithm>
#include <iostream>
#include <functional>
#include <vector>
#include <cassert>
 
class NonCopyable
{
   protected:
    NonCopyable() {}
    ~NonCopyable() {}
  private:
    NonCopyable( const NonCopyable& );
    NonCopyable& operator=( const NonCopyable& );
};
 
template<typename P>
struct Deleter
{
   void operator()(P p){ delete p; }
};
 
template<typename C>
inline void deleteAll(const C& c)
{
  std::for_each( c.begin(),c.end(),
                 Deleter<typename C::value_type>() );
}
 
template<typename C>
inline void findAndErase(C& c,typename C::value_type v)
{
  c.erase( std::find(c.begin(),c.end(),v) );
}


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
class Graph;
class Vertex;
class Edge;
 
typedef std::vector<Vertex*> VContainer;
typedef std::vector<Edge*>   EContainer;
 
class DependencyManager
{
     friend class Graph;
     friend class Vertex;
     friend class Edge;
 
   private:
     static Vertex* createVertex(Graph* graph);
     static void destroyVertex(Vertex* vertex);
 
     static Edge* createEdge(Graph* graph,Vertex* from,Vertex* to);
     static void  destroyEdge(Edge* edge);
 
     static void clear(Graph* graph);
};
//----------------- Graph ------------------------------------
class Graph: private NonCopyable
{
     friend class DependencyManager;
   public:
     Graph();
     virtual ~Graph();
 
     const VContainer& vertices() const { return vertices_; }
     const EContainer& edges()    const { return edges_; }
 
     Vertex* addVertex();
     Edge*   addEdge(Vertex* from,Vertex* to);
     void clear();
 
   private:
     VContainer vertices_;
     EContainer edges_;
     bool clearMode_;
};
 
Graph::Graph():NonCopyable(),clearMode_(false)
{
 
}
 
Graph::~Graph()
{
   clear();
}
 
Vertex *Graph::addVertex()
{
   return DependencyManager::createVertex(this);
}
 
Edge *Graph::addEdge(Vertex *from, Vertex *to)
{
   return DependencyManager::createEdge(this,from,to);
}
 
void Graph::clear()
{
   DependencyManager::clear(this);
}
//------------------- Vertex ------------------------------------
class Vertex: private NonCopyable
{
    friend class DependencyManager;
  public:
    virtual ~Vertex();
 
    const EContainer& inEdges() const{ return inEdges_;  }
    const EContainer& outEdges()const{ return outEdges_; }
 
    Graph* graph()const{ return graph_; }
 
  private:
    Vertex(Graph* graph):graph_(graph){}
 
    Graph* graph_;
    EContainer inEdges_;
    EContainer outEdges_;
};
 
Vertex::~Vertex()
{
  DependencyManager::destroyVertex(this);
  std::cout<<"~Vertex()"<<std::endl;
}
//------------------- Edge ------------------------------------
class Edge: private NonCopyable
{
     friend class DependencyManager;
   public:
     virtual ~Edge();
     Vertex* from()const { return from_; }
     Vertex* to()  const { return to_; }
 
     Graph* graph()const{ return graph_; }
 
   private:
     Edge(Graph* graph,Vertex* from,Vertex* to);
 
     Graph* graph_;
     Vertex* from_;
     Vertex* to_;
};
 
Edge::Edge(Graph *graph, Vertex *from, Vertex *to)
  :NonCopyable(),graph_(graph),from_(from),to_(to)
{
 
}
 
Edge::~Edge()
{
    DependencyManager::destroyEdge(this);
    std::cout<<"~Edge()"<<std::endl;
}
//------------------- DependencyManager ------------------------
Vertex *DependencyManager::createVertex(Graph *graph)
{
  assert(graph);
  Vertex* vertex= new Vertex(graph);
  graph->vertices_.push_back(vertex);
  return vertex;
}
 
Edge *DependencyManager::createEdge(Graph *graph, Vertex *from, Vertex *to)
{
   assert(graph && from!=to && graph==from->graph_ && graph==to->graph_);
   Edge* edge= new Edge(graph,from,to);
   graph->edges_.push_back(edge);
   from->outEdges_.push_back(edge);
   to->inEdges_.push_back(edge);
   return edge;
}
 
void DependencyManager::destroyVertex(Vertex *vertex)
{
  assert(vertex);
  if(!vertex->graph_->clearMode_)
  {
    findAndErase(vertex->graph_->vertices_,vertex);
    deleteAll(vertex->inEdges_);
    deleteAll(vertex->outEdges_);
    vertex->inEdges_.clear();
    vertex->outEdges_.clear();
  }
}
 
void DependencyManager::destroyEdge(Edge *edge)
{
  assert(edge);
  if(!edge->graph_->clearMode_)
  {
    findAndErase(edge->graph_->edges_,edge);
    findAndErase(edge->from_->outEdges_,edge);
    findAndErase(edge->to_->inEdges_,edge);
  }
}
 
void DependencyManager::clear(Graph *graph)
{
  assert(graph);
  graph->clearMode_= true;
 
  deleteAll(graph->vertices_);
  deleteAll(graph->edges_);
 
  graph->vertices_.clear();
  graph->edges_.clear();
 
  graph->clearMode_= false;
}
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    Graph g;
    Vertex* v1= g.addVertex();
    Vertex* v2= g.addVertex();
 
    Edge* e= g.addEdge(v1,v2);
 
    delete v1;
 
    return a.exec();
}
Думаю из кода понятно что попытка смоделировать граф/ребра/вершины.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 17:59
Привет! Вот еще темы с ответами:

Запрет shared_ptr быть наследником определённого класса - C++
Добрый день, #include &lt;memory&gt; class A { }; class B : public A {

Как при помощи указателя на базовый класс обратится к полю наследуемого класса? - C++
Всем привет! столкнулся с такой проблемой. У меня есть массив указателей на базовый виртуальный класс,и например я присваиваю указателю на...

как исправить Ошибка 8 error C2259: Tabl: невозможно создать экземпляр абстрактного класса - C++
имеется абстрактный класс, у нее есть 4 виртуальных функций: запись и чтение с помощью С и С++ имеется класс Tabl производный от...

Создание объекта класса, являющегося суммой 2ух других - C++
Нужно получить время на часах, сложив 2 другие временные отметки. Как я понимаю, нужно переопределить операцию сложения. Тогда как будет...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2015, 17:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru