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

Как вытащить данные из объекта? - C++

Восстановить пароль Регистрация
 
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 13:24     Как вытащить данные из объекта? #1
Доброго времени суток! Есть структура граф. Есть два представления Л и М граф. В конструкторе графа создается объект абстрактного класса, потомки которого Л и М.

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
#include "ABCGraph.h"
#include "LGraph.h"
#include "MGraph.h"
#pragma once;
//using std::vector;
//using std::list;
 
 
template <class Vertex, class Edge> class Graph
{
protected:
    ABCG <Vertex, Edge> *abstr;
public:
    Graph()                                     // конструктор графа без параметров
    {
        abstr = new LGraph<Vertex, Edge>();
    };
 
    Graph (int _V, bool _D, bool _T)            // конструктор с 3 параметрами
    {
        if(_T == LGRAPH) 
            abstr = new LGraph<Vertex, Edge>(_V, _D);
        else
            abstr = new MGraph<Vertex, Edge>(_V, _D);
 
    };
 
    Graph (int _V, int _E, bool _D, bool _T)    // конструктор с 4 параметрами
    {
        if(_T == LGRAPH) 
        
            abstr = new LGraph<Vertex, Edge>(_V, _E, _D);
            //absrt->randE(_E);
        
        else
        {
            abstr = new MGraph<Vertex, Edge>(_V, _E, _D);
            //abstr->randE(_E);
        };
    };
Абстрактный
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
#include "Edge.h"
#include <vector>
#pragma once;
#include <time.h>
using std::vector;
//enum {UNOR, OR};
#define LGRAPH 0
#define MGRAPH 1
 
template <class Vertex, class Edge> class ABCG
{
protected:
    /*static bool hasVertex(Vertex *v) { return v->index != -1; }
    static bool hasEdge(Edge *e) { return e->index != -1; }
    Vertex* getVertex(int _indx) { return v.at(_indx); }*/  
    vector <Vertex *> v;
    vector <Edge *> e;
    
public:
    vector<vector<Edge *>> matrix;
    vector<vector<Edge *>> *getMatrix() { return matrix; }
    vector<Vertex *> getVertexesVector(){ return v; }
    vector<Edge *> getEdgesVector() { return e; }
    virtual ~ABCG (){};
    virtual int V( ) = 0;       // возвращает число вершин в графе,
    virtual int E( ) = 0;       // возвращает число ребер в графе,
    virtual bool Directed( ) = 0;   // возвращает тип графа (ориентированный / неориентированный)
    virtual bool Dense( ) = 0;  // возвращает форму представления графа (L- граф / M- граф),
        virtual float K( ) = 0;     // возвращает коэффициент насыщенности графа,
    virtual void fromAbstract(vector<Vertex *> v, vector<Edge *> e, bool d) = 0; //ОК
    virtual Vertex* InsertV( ) = 0; // добавляет вершину к графу и возвращает адрес дескриптора вновь созданной вершины,
    virtual Vertex* InsertV(Vertex* v) = 0; 
    virtual bool DeleteV (Vertex* v) = 0;   
    virtual Edge* InsertE(Vertex* v1,Vertex* v2) = 0;
    virtual bool DeleteE (Vertex* v1,Vertex* v2) = 0;   
    virtual Edge* GetEdge(Vertex* v1, Vertex* v2) = 0;  
    virtual Vertex* getVertex(int _indx) = 0;
Л граф
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
#include "ABCGraph.h"
#include <vector>
#include <list>
#include <map>
#include <algorithm>
using namespace std;
using std::vector;
using std::list;
#pragma once;
 
template <class Vertex, class Edge> class LGraph: public ABCG <Vertex, Edge> 
{
private: 
    vector<list<Edge *>> Adjlist;
    bool directed;
    int cnt_v, cnt_e;
 
    static bool hasVertex(Vertex *v) { return v->index != -1; }
    static bool hasEdge(Edge *e) { return e->index != -1; }
    //Vertex* getVertex(int _indx) { return v.at(_indx); }              
    //  vector <Vertex *> *v;
    //vector <Edge *> *e;
    //vector<vector<Edge *>> matrix;
 
public:
    //vector<vector<Edge *>> getMatrix() { return matrix; }
    vector<Vertex *>* getVertexesVector(){ return v;    }
    vector<Edge *>* getEdgesVector() { return e; }
    vector<vector<Edge *>> matrix;
 
    LGraph()
    {
        cnt_v = 0; cnt_e = 0;
        directed = false;
    };
 
    LGraph (int _v, bool _D )
    {
        cnt_v = _v; cnt_e = 0;
        directed = _D;
        for(int i = 0; i < _v; i++)
            InsertV();
        
    };
 
    LGraph (int _v, int _e, bool _D )   
    {
        cnt_v = _v; cnt_e = _e;
        directed = _D;
        for(int i = 0; i < _v; i++)
            InsertV();
        randE(_e);
    };
    LGraph (const LGraph &LG)
    {
        cnt_v = LG->cnt_v;
        Adjlist = LG->Adjlist;          //чует мое сердце че-то недоброе
        directed = LG->Directed();
    };
M граф
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
#include "ABCGraph.h"
#include <vector>
#pragma once;
using namespace std;
using std::vector;
//using std::list;
 
template <class Vertex, class Edge> class MGraph: public ABCG <Vertex, Edge>
{
private:
    //vector <Vertex *> v;
    //vector <Edge *> e;
    //
    bool directed;
    int cnt_v, cnt_e;
 
    static bool hasVertex(Vertex *v) { return v->index != -1; }
    static bool hasEdge(Edge *e) { return e->index != -1; }
//  Vertex* getVertex(int _indx) { return v.at(_indx); }                
 
public:
    //vector<vector<Edge *>> getMatrix() { return matrix; }
    vector<Vertex *>* getVertexesVector(){ return v;    }
    vector<Edge *>* getEdgesVector() { return e; }
    vector<vector<Edge*>> matrix;
    
    MGraph()
    {
        cnt_v = 0; cnt_e = 0;
        directed = false;
        //v = new vector<Vertex*>;
        //e = new vector<Edge*>;
    };
 
    MGraph (int _v, bool _D )
    {
        cnt_v = _v; cnt_e = 0;
        
        //v = new vector<Vertex*>;
        //e = new vector<Edge*>;
        
        for(int i = 0; i < _v; i++)
            InsertV();
        directed = _D;
    };
 
    MGraph(int _v, int _e, bool _D)
    {
        
        cnt_v = _v; cnt_e = _e;
        
        //v = new vector<Vertex*>;
        //e = new vector<Edge*>;
        
        for(int i = 0; i < _v; i++)
            InsertV();
        directed = _D;
        randE(_e);
        
    };
    MGraph(const MGraph &MG)
    {
        v = MG->getVertexesVector();
        e = MG->getEdgesVector();
        directed = MG->Directed();
        matrix = MG->matrix; //чует мое сердце че-то недоброе
        
    };
Есть задача для графа - нахождение ребер мостов. Конструктору задачи параметром передается объект граф. Из этого графа нужно вытащить объект двумерный массив и работать с ним (конкретно с вершинами и ребрами)

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
#include "Graph.h"
#include <vector>
#pragma  once;
using namespace std;
 
template <class Vertex, class Edge> class Bridge
{
private:
    Graph<Vertex, Edge> *g;
    vector<bool> used;
    vector<Vertex *> vertexes;
    vector<vector<Edge* >> edges;
    vector<Edge *> edgess;
    vector<Edge *> bridges;
    int timer;
    int n;
    vector<int> tin, fup;
    
    Edge* IS_BRIDGE(Vertex *V1, Vertex *V2)
    {
        Edge *ed = new Edge(V1, V2);
        bridges.push_back(ed)
        return ed;
    }
 
    static int min(int a, int b)
    {
        if(a > b) return b;
        else return a;
    }
public:
    Bridge(Graph<Vertex, Edge> *g)
    {
        //g->(G);
        g->ToMatrixGraph();
        timer = 0;
        Find_Bridge(g);
    };
 
    Edge* Find_Bridge (Graph<Vertex, Edge> *g)
    {
        for (int i=0; i<n; ++i)
            used[i] = false;
        for (int i=0; i<n; ++i)
        {
            Vertex *ver = g->getVertex(i);
            if (!used[i])
                Dfs (g, ver, NULL);
        }
    };
 
    void Dfs(Graph<Vertex, Edge> *g, Vertex *v, Vertex *p)// = -1)
    {
        used[v->index] = true;
        tin[v->index] = fup[v->index] = timer++;            
        for (size_t i=0; i<g->matrix[v->index].size(); ++i) //      
            {
                if (g->matrix[v->index][i] != 0) continue;
                Vertex *tto = g->matrix[v->index][i]->to;
                if (to == p)  continue;     
                    if (used[to->index])
                        fup[v->index] = min (fup[v->index], tin[to->index]);
                    else 
                    {
                        Dfs (g,to, v);
                        fup[v->index] = min (fup[v->index], fup[to->index]);
                        if (fup[to->index] > tin[v->index])
                            IS_BRIDGE(v,to);
                    }
            }
    };
};
В общем matrix не вытаскивается(( Вообще возможно ее вытащить... До этого передавал объект графа только в конструктор.вот main
C++
1
2
3
4
5
6
7
8
9
10
#include "Graph.h"
#include "Bridges.h"
#include <iostream>
using namespace std;
 
void main()
{
    Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1(20,180,0,1);
        Bridge<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> briges(&g1);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.09.2011, 13:39     Как вытащить данные из объекта? #2
C++
1
2
    vector<vector<Edge *>> matrix;
    vector<vector<Edge *>> *getMatrix() { return matrix; }
ну или ссылку возвращай, либо делай return &matrix;
или какой массив нужен то?
и зачем тебе getMatrix(), если у тебя matrix public?
C++
1
2
3
4
5
6
7
8
        MGraph(const MGraph &MG)
    {
            v = MG->getVertexesVector();
            e = MG->getEdgesVector();
            directed = MG->Directed();
            matrix = MG->matrix; //чует мое сердце че-то недоброе
            
    };
плохой конструктор.

Код то вообще компилируется?
LosAngeles
Заблокирован
06.09.2011, 13:44     Как вытащить данные из объекта? #3
идём по порядку:

Цитата Сообщение от Den4ik Посмотреть сообщение
В конструкторе графа создается объект абстрактного класса
объект абстрактного класса по определению нельзя создать о_0


Цитата Сообщение от Den4ik Посмотреть сообщение
if(_T == LGRAPH)
то что ты замутил с define надо срочно убрать, это же ужас


Цитата Сообщение от Den4ik Посмотреть сообщение
template <class Vertex, class Edge> class ABCG
странное сокращение, если я правильно понимаю это AbstractGraph?


Цитата Сообщение от Den4ik Посмотреть сообщение
vector<vector<Edge *>> matrix;
vector<vector<Edge *>> *getMatrix() { return matrix; }
1) почему matrix публичный?
2) почему getMatrix возвращает указатель на инкапсулированные данные? подобных ошибок несколько в коде

ты постоянно меняешь стиль - то у тебя методы с маленькой буквы, то с большой

бегло просмотрел лграф и мграф и осталось ощущение что ты далеко не все методы ABCG реализовал
непонятно назначение класса brige и как он вобще работает
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 14:02  [ТС]     Как вытащить данные из объекта? #4
matrix публичный потому, что я пытался его вытащить в методах Bridge (знаю коряво, уже просто не знаю как еще).

Класс Bridge для нахождения ребер мостов в графе который передается в конструктор. Ну надо так вот сделать, сам не рад.

Реализовал все методы из ABCG, просто кода очень много, не стал копировать.

А вообще все работает как надо, но без задачи нахождения мостов. А вот с такой реализацией задачки, ошибочки.

Добавлено через 1 минуту
'matrix' : is not a member of 'Graph<Vertex,Edge>'

так же p, to, index.

Добавлено через 5 минут
и used.

и вот такая: left of '->index' must point to class/struct/union/generic type ну это в чем то коряво граф передаю(не пойму как надо)
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.09.2011, 14:12     Как вытащить данные из объекта? #5
C++
1
2
3
MGraph(const MGraph &MG)
....
MG->getVertexesVector()
left of '->index' must point to class/struct/union/generic
Остается только порекомендовать почитать книжку по с++ начального уровня.
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 14:17  [ТС]     Как вытащить данные из объекта? #6
ну спасиб! очень помогло!
Yandex
Объявления
06.09.2011, 14:17     Как вытащить данные из объекта?
Ответ Создать тему
Опции темы

Текущее время: 17:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru