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

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

Войти
Регистрация
Восстановить пароль
 
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
#1

Не создается объект - C++

28.08.2011, 13:46. Просмотров 882. Ответов 8
Метки нет (Все метки)

Есть абстрактный класс от него 2 наследника. В этом классе есть итератор вершин графа
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
template <class Vertex, class Edge> class ABCG
{
protected:
    vector <Vertex *> v;
    vector <Edge *> e;
public:
    vector<Vertex *> getVertexesVector(){ return v; }
    vector<Edge *> getEdgesVector() { return e; }
    virtual ~ABCG (){};
class Iterator_V
    {
    private: 
        vector<Vertex *> vx;
        typename vector<Vertex *>::iterator *itrV;
    public:
        Iterator_V(ABCG<Vertex, Edge> &AG)
        {
            vx = getVertexesVector();
            itrV = vx.begin();
        };
        bool virtual done()
        {
            if (itrV == vx.end()) return true;
            return false;
        };
        virtual void operator ++ ()
        {
            itrV++;
        };
        virtual bool next()
        {
            if (done()) return false;
            operator ++();
            return true;
        };
        virtual Vertex* operator * () 
        {
            if(done())return NULL;
            return *itrV;
        };
        virtual Vertex* get(){return operator*();};
        virtual void begin(){ itrV = vx.begin();};
    };
};
и есть класс Граф, в котором переопределяются методы итератора
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
template <class Vertex, class Edge> class Graph
{
protected:
    ABCG <Vertex, Edge> *abstr;
public:
    Graph()     
    {
        abstr = new LGraph<Vertex, Edge>();
    };
class Iterator_V
    {
    public:
        Iterator_V(Graph& g)
        {
              if(g.Dense() == LGRAPH)
            abstr = new LGraph<Vertex, Edge>::Iterator_V((LGraph<Vertex, Edge> *)g.abstr);
              else
            abstr = new MGraph<Vertex, Edge>::Iterator_V((MGraph<Vertex, Edge> *)g.abstr);
        }
        void operator++() { return abstr->operator++(); }
        bool done() { return abstr->done(); }
        bool next() { return abstr->next(); }
        Vertex* operator*() { return abstr->operator*(); }
        Vertex* get() { return abstr->get(); }
        void begin() { return abstr->begin(); }
    protected:
        typename ABCG<Vertex, Edge>::Iterator_V *abstr;
    };
пытаюсь создать объект итератора
C++
1
2
3
4
5
void main()
{
    Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1(20,180,0,1)
           Iterator_V It(g1);
}
выдает ошибку Iterator_V undeclared identifier. Не могу понять почему не видит класс?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2011, 13:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не создается объект (C++):

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект - C++
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Не создается объект класса - C++
Почему я не могу создать объект класса Zamovlena? Могу создать только указатель. Zamovlena.h #ifndef ZAMOVLENA_H #define ZAMOVLENA_H ...

Создается объект абстрактного класса:( - C++
Вот допустим у меня есть класс: class Cell { public: Cell() {} ~Cell() {} virtual std::string getData() const = 0; }; Ну...

Почему не создается второй объект класса? - C++
#include &lt;string&gt; // Заголовочный файл students.h class students { public: students(std::string user_name, std::string...

4 раза в памяти создается объект класса - C++
Доброго времени суток! Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; ...

Статический объект в статической библиотеке не создается - C++
Есть статическая библиотека. В ней статически создаю синглтон: static Singleton &amp;data = Singleton::getInstance(); Т.к. это глобальный...

8
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
28.08.2011, 14:26 #2
инклуд не забыли?
0
LosAngeles
Заблокирован
28.08.2011, 14:33 #3
; забыл

Добавлено через 17 секунд
в третье строке main
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
28.08.2011, 15:11  [ТС] #4
C++
1
2
3
4
5
6
7
8
#include "Graph.h"
#include <iostream>
 
void main()
{
Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1(20,180,0,1)
           Iterator_V It(g1);
}
Файл Graph.h
C++
1
2
3
4
5
6
7
8
9
#include "ABCGraph.h"
#include "LGraph.h"
#include "MGraph.h"
#pragma once;
 
template <class Vertex, class Edge> class Graph
{
....
};
Добавлено через 19 минут
в сообщение без ";" скопировал
0
LosAngeles
Заблокирован
28.08.2011, 15:24 #5
так Iterator_V и нету, есть Graph<...>::Iterator_V?
1
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
28.08.2011, 17:03  [ТС] #6
У меня конструктор итератора в Графе был не правильный т.к. в классах Л и М графов не описан итератор.
C++
1
2
3
4
5
6
7
class Iterator_V
    {
    public:
        Iterator_V(Graph& g)
        {
                 abstr = new ABCG<Vertex, Edge>::Iterator_V((ABCG<Vertex, Edge> *)g.abstr);
};
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
template <class Vertex, class Edge> class ABCG
{
protected:
        vector <Vertex *> v;
        vector <Edge *> e;
public:
        vector<Vertex *> getVertexesVector(){ return v; }
        vector<Edge *> getEdgesVector() { return e; }
        virtual ~ABCG (){};
class Iterator_V
        {
        private: 
                vector<Vertex *> vx;
                typename vector<Vertex *>::iterator *itrV;
        public:
                Iterator_V(ABCG<Vertex, Edge> *AG)
                {
                        vx = getVertexesVector();
                        itrV = vx.begin();
                };
                bool virtual done()
                {
                        if (itrV == vx.end()) return true;
                        return false;
                };
                virtual void operator ++ ()
                {
                        itrV++;
                };
                virtual bool next()
                {
                        if (done()) return false;
                        operator ++();
                        return true;
                };
                virtual Vertex* operator * () 
                {
                        if(done())return NULL;
                        return *itrV;
                };
                virtual Vertex* get(){return operator*();};
                virtual void begin(){ itrV = vx.begin();};
        };
};
но так выдает ошибку error C2352: 'ABCG<Vertex,Edge>::getVertexesVector' : illegal call of non-static member function.

Добавлено через 1 минуту
на строку
C++
1
  vx = getVertexesVector();
0
LosAngeles
Заблокирован
28.08.2011, 17:25 #7
ну правильно метод ведь не статический, нужен конкретный объект для которого ты вызываешь этот метод, создай его сначала. Никакой связи между внутренним и внешним классом, как в джава нет. В С++ они просто служат как пространство имён, внутренний класс не видит метод\переменных внешнего класса
1
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
28.08.2011, 20:57  [ТС] #8
Спасиб, понял.
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
06.09.2011, 20:57  [ТС] #9
Опять проблемка. Как и итератор в абстрактном классе описываю класс задачи нахождения мостов, подобным образом. Но опять не видит класс((

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 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;
    
    
public:
    Bridge(ABCG<Vertex, Edge> *g)
    {
        g->ToMatrixGraph();
        vector<vector<Edge *>> m = g->matrix;
        timer = 0;
        Find_Bridge();
    };
        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;
    }
    Edge* Find_Bridge ()
    {
        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 (ver, NULL);
        }
    };
};
main
C++
1
2
3
4
5
void main()
{
    Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1(20,180,0,1);
        Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>>::Bridge briges(g1);
}
и в результате

'Bridge' : undeclared identifier
'Bridge' : is not a member of 'Graph<Vertex,Edge>'

Добавлено через 1 час 27 минут
Надо было Bridge в Graph положить. А лучше в отдельный файл.
Но нужен конструктор
C++
1
2
3
4
Bridge(ABCG<Vertex, Edge> *g)
    {
          ...
        };
но ошибка:
' Bridge<Vertex,Edge>::Bridge(ABCG<Vertex,Edge> *)' : cannot convert parameter 1 from 'Graph<Vertex,Edge>' to 'ABCG<Vertex,Edge> *' как с моей структуркой можно оставить этот конструктор?

Добавлено через 23 минуты
В общем в main
C++
1
2
3
4
5
{
Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1(20,180,0,1);
Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>>::Iterator_V It(g1); // работает как надо
Bridge<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> briges(&g1); // ошибка с конвертированием параметров
};
у итератора конструктор также принимает параметр

C++
1
Iterator_E (ABCG<Vertex, Edge> *AG)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 20:57
Привет! Вот еще темы с ответами:

Зачем для указателя на объект класса создается отдельный класс - C++
Читаю книгу Джефа Элджера &quot;Библиотека программиста С++&quot;, там в главе про умные указатели приводится пример, где для указателя на класс...

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++
Предположим, class A { ... }; class B { .... A a; ... };

Основы: указатель на объект или объект, что выбрать? - C++
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда объект. Например: // есть класс ...

компилятор считает объект l-value, но объект таковым не является - C++
итак есть базовый абстрактный класс Дерево, есть два его наследника Плодовое Дерево и Лесное Дерево. Также существует класс Контейнер...


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

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

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