2017-05-04 1 views
-2

좋습니다.파생 된 클래스에서 기본 클래스 메서드를 호출 할 수 없습니다.

igraph.h :

#include <iostream> 
#include <vector> 
#include <array> 

class igraph 
{ 
protected: 
    std::vector<std::vector<int>> matrix; // reprezentacja macierzowa grafu 
    std::vector<std::vector<int>> adjacency_list; // reprezentacja w postaci listy sasiadow 
    int number_of_vertices; 
    int number_of_edges; 
public: 
    igraph(); 

    igraph(std::vector<std::vector<int>> data, int vertices); // konstruktor przyjmujacy dane w postaci wierzcholek, wierzcholek, waga/przepustowosc 

    const std::vector<std::vector<int>> &getMatrix() const; 

    const std::vector<std::vector<int>> &getAdjacency_list() const; 

    unsigned int getNumber_of_vertices() const; 

    unsigned int getNumber_of_edges() const; 

    void print_matrix(); 

    void print_list(); 

}; 

igraph.cpp :

#include "igraph.h" 
#include <iomanip> 

/* 
* Interfejs dla grafow - nieskierowanych i skierowanych 
*/ 

igraph::igraph() : number_of_vertices(0), number_of_edges(0) 
{ 

} 

igraph::igraph(std::vector<std::vector<int>> data, int vertices) 
{ 
    this->number_of_edges = data.size(); 
    this->number_of_vertices = vertices; 
    this->matrix = std::vector<std::vector<int>>(number_of_vertices, std::vector<int>(number_of_vertices, -1)); // zainicjalizowanie macierzy wartosciami -1 
    this->adjacency_list = std::vector<std::vector<int>>(number_of_vertices, std::vector<int>()); 
} 

const std::vector<std::vector<int>> &igraph::getMatrix() const { 
    return matrix; 
} 

void igraph::print_matrix() 
{ 
    std::cout << '\n' << "Reprezentacja macierzowa: " << '\n'; 
    std::cout << " "; 
    int i = 0; 
    for (i = 0; i < this->number_of_vertices; i++) 
    { 
     std::cout << std::setw(4) << i << " "; 
    } 
    std::cout << "\n"; 
    i = 0; 
    for (auto row = this->matrix.begin(); row!=this->matrix.end(); ++row) 
    { 
     std::cout << std::setw(4) << i; 
     for (auto col = row->begin(); col!=row->end(); ++col) 
     { 
      std::cout << std::setw(4) << *col << " "; 
     } 
     std::cout << '\n'; 
     i++; 
    } 
} 

void igraph::print_list() 
{ 
    std::cout << '\n' << "Reprezentacja w postaci listy sasiadow: " << '\n'; 
    int i, x; 
    for (i = 0; i < this->number_of_vertices; i++) 
    { 
     std::cout << std::setw(4) << i << " "; 
     for (x = 0; x < adjacency_list[i].size(); x++) 
     { 
      std::cout << std::setw(4) << adjacency_list[i][x] << " "; 
     } 
     std::cout << '\n'; 
    } 

} 

const std::vector<std::vector<int>> &igraph::getAdjacency_list() const 
{ 
    return adjacency_list; 
} 

unsigned int igraph::getNumber_of_vertices() const 
{ 
    return number_of_vertices; 
} 

unsigned int igraph::getNumber_of_edges() const 
{ 
    return number_of_edges; 
} 

가 지금은 igraph에서 파생 할 그래서 나는이 같은 코드를 가지고있다. (나는 igraph.hdirected_graph.h 모두 포함 경우) 내가 directed_graph myGraph = directed_graph(data, vertices)을 이제 다른 곳 .cpp 파일

#include "directed_graph.h" 

directed_graph::directed_graph() : igraph() 
{ 
} 

directed_graph::directed_graph(std::vector<std::vector<int>> data, int vertices) : igraph(data, vertices) 
{ 
    int row, col, cost; 
    for (int i = 0; i<number_of_edges; i++) // wpisywanie danych do macierzy 
    { 
     row = data[i][0]; 
     col = data[i][1]; 
     cost = data[i][2]; 
     matrix[row][col] = cost; 
    } 
    int current_search = 0; 
    for (int x = 0; x < number_of_vertices; x++) 
    { 
     for (int i = 0; i<number_of_edges; i++) 
     { 
      if (data[i][0] == current_search) 
      { 
       adjacency_list[current_search].push_back(data[i][1]); 
      } 
     } 
     current_search++; 
    } 

} 

:

#pragma once 
#include <vector> 
#include "igraph.h" 

class directed_graph: public igraph 
{ 
public: 
    directed_graph(); 
    directed_graph(std::vector<std::vector<int>> data, int vertices); 
}; 

directed_graph.cpp : 나는 directed_graph.h라는 클래스를 생성하는 이유입니다. 그런 다음 print_matrix()print_list()으로 인쇄하고 싶습니다. 나는 그 오류를 얻을 :

'igraph': 'class' type redefinition 'igraph': base class unindefined 'print_matrix': is not a member of directed_graph 'print_list': is not a member of directed_graph

여기에 어떤 문제가 있습니까? 나는 그것이 잘되어야한다고 생각했지만 제 의견으로는 올바르게 파생되었습니다. 그러나 무엇이 잘못 되었습니까?

+0

가능한 복제 [C++의 #include 가드 (http://stackoverflow.com/questions/8020113/c-include-guards) –

답변

1

'igraph': 'class' type redefinitionclass igraph을 다시 정의하고 있음을 알려줍니다. igraph.h을 두 번 포함하기 때문입니다. 하나는 "기타".cpp 파일에서, 다른 하나는 directed_graph.h에서 한 번. #pragma once을 잊었습니다.

+0

수 있습니까 실제로'의 #pragma once''.cpp' 파일 ? 나는'# include '파일을'.h' 파일로 옮겼습니다. 문제가되는 파일은'menu.cpp'이고'#pragma once'가있는'menu.h' 파일을 포함하고 있습니다. 하지만 그 일은 감사합니다. – Frynio

+0

아니요,'rapher.h '에'#pragma once'를 넣는 것을 잊었습니다. –

+0

맞아요, 맞아요. – Frynio

0

다시 정의하지 않도록 .h에 대해 가드를 사용해야합니다. 의

#ifndef _X_H_ 
#define _X_H_ 


.... 


#endif // _X_H_ 
관련 문제