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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Линейный поиск в массиве структуры http://www.cyberforum.ru/cpp-beginners/thread1508038.html
Нужно с помощью линейного поиска искать в готовом массиве структуры значение вводимое с клавиатуры. Напишите шаблон , по которому это можно реализовать. Спасибо.
C++ Windows боксы (Окна, формы) Приветствую уважаемые пользователи cyberforum! Сразу не знаю как правильно называется это. Но как можно реализовать окна на Windows? http://www.cyberforum.ru/cpp-beginners/thread1508019.html
C++ Не могу осознать причину ошибки
Ну, в общем, читаю, такой, Страуструпа и прогаю малеху его примеры. Вот реализация одного из них: #include<iostream> char * strcpy1(char * dst, const char * src){ while (*dst++ = *src++) ; return dst; } int main()
Строка string. Не присваивается новое значение C++
Есть строка: string str_in = "A"; Она используется в созданной мной функцией как один из аргументов: fuction(arg1,arg2,str_in,arg4); Внутри функции значение строки меняется: char sim; //string m;
C++ Наследование методов http://www.cyberforum.ru/cpp-beginners/thread1507978.html
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот: Есть у нас древо классов: base > s2 > s3 > s4 > ... И есть в base virtual void f(){ _act1_ } А в s2 virtual void f(){ _act2_ } А в s3 должен обратно быть метод base::virtual void f(){ _act1_ } И чтобы s4 также использовал base::virtual void f(){ _act1_ } Т.е. переопределение виртуального должно работать...
C++ Класс Singletone Здравствуйте! Продолжаю готовиться к экзамену по С++. На последнем уроке вкратце рассказали про класс Singleton, но я расслабился и слушал невнимательно, так как урок был последний. Одним словом, посоветуйте хороший источник, где рассказывается про класс Singletone, где легко и понятно объясняется, от простого к сложному, с примерами на С++ на каждом этапе. Желательно на русском языке. ... подробнее

Показать сообщение отдельно
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,387
Записей в блоге: 17
01.08.2015, 17:59     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Цитата Сообщение от 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();
}
Думаю из кода понятно что попытка смоделировать граф/ребра/вершины.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru