2015-01-03 2 views
0

Я получаю ошибку ниже по реализации моего класса Vertex в MyFile.h и MyFile.ccC++ вопрос заголовка и .cc файл с членом класса

// MyFile.h 
#ifndef FILE 
#define FILE 

#include <set> 

class Vertex{             
public: 
    int i, j; 
    set<Vertex*> adj; //references to adjacent vertices (max of 4) 

    Vertex(); 
    ~Vertex(); 
    //end constructors 

    void setPos(int row, int col); 

    /** must overload for set<Vertex> to function */ 
    const bool operator < (const Vertex &o) const; 

};//END class Vertex 

#endif 


// MyFile.cc 
#include "MyFile.h" 
#include <set> 
using namespace std; 


Vertex::Vertex():i(-1), j(-1), adj(0,5)/*may store [0,4] elements*/{} 

Vertex::~Vertex(){ 
    adj.clear(); 
} 
//end constructors 

void Vertex::setPos(int row, int col){ 
    i = row; 
    j = col; 
}//end setPos() 

/** must overload for set<Vertex> to function */ 
const bool Vertex::operator < (const Vertex &o) const{ 
    if(i < o.i) 
     return true; 
    if(i > o.i) 
     return false; 
    return j < o.j; 
} 


/** connect v1 and v2 such that they are adjacent */ 
void addEdge(Vertex* v1, Vertex* v2){ 
    v1->adj.insert(v2); 
    v2->adj.insert(v1); 
}//end addEdge 

Я попробовал несколько способов реализации класса, но Я постоянно получаю эту ошибку:

In file included from MyFile.cc:5:0: 
MyFile.h:15:2: error: 'set' does not name a type 
    set<Vertex*> adj; //references to adjacent vertices (max of 4) 
^
MyFile.cc: In constructor 'Vertex::Vertex()': 
MyFile.cc:15:32: error: class 'Vertex' does not have any field named 'ad 
j' 
Vertex::Vertex():i(-1), j(-1), adj(0,5)/*may store [0,4] elements*/{} 
           ^
MyFile.cc: In destructor 'Vertex::~Vertex()': 
MyFile.cc:18:2: error: 'adj' was not declared in this scope 
    adj.clear(); 
^
MyFile.cc: In function 'void addEdge(Vertex*, Vertex*)': 
MyFile.cc:39:6: error: 'class Vertex' has no member named 'adj' 
    v1->adj.insert(v2); 
    ^
MyFile.cc:40:6: error: 'class Vertex' has no member named 'adj' 
    v2->adj.insert(v1); 
    ^
make: *** [MyFile.o] Error 1 

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

+1

В определении вашего класса 'std :: set adj;'. И используйте что-то другое, кроме 'FILE' для защитника включения - это рецепт катастрофы. –

ответ

2

Вы заявляете поле

set<Vertex*> adj; 

но построить его с

adj(0,5); 

Вы не можете ожидать, что 5 быть преобразован в указатель на Vertex

Я хотел бы предложить использовать некоторые smart pointers, возможно a shared_ptr

std::set<std::shared_ptr<Vertex>> adj; 

предположительно C++11 код.

Подробнее о C++ programming. Также читайте documentation of std::set (заметьте, что "range constructor" хочет итераторы в некоторые уже существующий набор)

Я бы построить adj как пустое множество и заполнить его позже (по крайней мере, внутри конструктора Vertex)

+0

Я считаю, что Set имеет конструктор, определяющий, сколько элементов он может содержать. Я также пробовал это, например, выделяя память с помощью пустого конструктора, и он все еще говорит, что у Vertex нет имени поля «adj» – Kolibrie

+0

Вместо «верить» (в программировании на С ++ большинство убеждений ошибочны), вы должны прочитать [документацию 'std :: set'] (http://www.cplusplus.com/reference/set/set/) –

+0

Причина, по которой я решил «поверить», состояла в том, что это то, что я интерпретировал из конструктора диапазона (2) Создает контейнер с таким количеством элементов, как диапазон [первый, последний], каждый элемент, построенный из соответствующего элемента в этом диапазоне ». Но я мог бы неправильно истолковать это. – Kolibrie

0

Следующая сообщение об ошибке дает хороший ключ:

In file included from MyFile.cc:5:0: 
MyFile.h:15:2: error: 'set' does not name a type 
    set<Vertex*> adj; //references to adjacent vertices (max of 4) 

Вам нужно использовать:

std::set<Vertex*> adj; 

Но тогда, комментарий в следующей строке кода не имеет смысла:

Vertex::Vertex():i(-1), j(-1), adj(0,5)/*may store [0,4] elements*/{} 

std::set не имеет конструктор, который будет делать то, что вы надеетесь.

+0

Хотя я использую «using namespace std;» в MyFile.cc? Можете ли вы объяснить, почему? – Kolibrie

+0

'using namespace std;' после строки '#include 'File.h" '. Когда компилятор разбирает код, содержимое «Файл».h 'перед использованием' namespace std; '. –

Смежные вопросы