Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42

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

06.09.2011, 13:24. Показов 2352. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Есть структура граф. Есть два представления Л и М граф. В конструкторе графа создается объект абстрактного класса, потомки которого Л и М.

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);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.09.2011, 13:24
Ответы с готовыми решениями:

Что такое конструктор по умолчанию? Как инициализируются данные-члены объекта?
Что такое конструктор по умолчанию? Как инициализируются элементы данных объекта, если класс имеет только неявно определенный...

Как вытащить данные из ole объекта?
в каждой стоке таблицы зашит объект ole (рисунок формата bmp), как можно можно сохранить этот рисунок на жесткий диск в виде файла формата...

Вытащить данные из объекта набора данных на макет в СКД
Всем привет! Столкнулся с СКД в первый раз и не совсем разобрался. Суть в следующем: есть внешний отчет, который написан с использованием...

5
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.09.2011, 13:39
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; //чует мое сердце че-то недоброе
            
    };
плохой конструктор.

Код то вообще компилируется?
0
Заблокирован
06.09.2011, 13:44
идём по порядку:

Цитата Сообщение от 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 и как он вобще работает
0
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 14:02  [ТС]
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 ну это в чем то коряво граф передаю(не пойму как надо)
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
06.09.2011, 14:12
C++
1
2
3
MGraph(const MGraph &MG)
....
MG->getVertexesVector()
left of '->index' must point to class/struct/union/generic
Остается только порекомендовать почитать книжку по с++ начального уровня.
0
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 14:17  [ТС]
ну спасиб! очень помогло!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.09.2011, 14:17
Помогаю со студенческими работами здесь

Как вытащить из свойства fields recordset вытащить данные в массив
Как вытащить из свойства fields recordset вытащить данные в массив ассоциативный , подскажите плиз

Как вытащить переменные из объекта навигатор
Есть код, который определяет разрешение экрана посетителя. for(var prop in screen) { if (navigator instanceof Object ||...

Как вытащить данные данные из цикла?
Добрый день. У меня возникла необходимость записать содержимое цикла в файл. Данные берутся из БД после чего заносятся в цикл. Результат...

Как вытащить данные из БД?
Все подключено нормально, но когда хочу вывести таким образом: for($i = 0; $i &lt; count($news); $i++){ echo '&lt;h1&gt;'.$news.'&lt;/h1&gt; }...

Как вытащить данные из БД?
Уже создавал тему в разделе БД. Попытка помочь была, что большое спасибо, но не получилась) В общем есть таблица в бд, в ней 4 строки....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru