2017-05-04 2 views
-2

Okay aufrufen. Also habe ich einen Code wie folgt bekommen:Kann Basisklasse-Methode nicht von abgeleitetem

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; 
} 

Jetzt möchte ich von igraph abzuleiten. Deshalb habe ich eine Klasse erstellen directed_graph.h genannt:

#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:

#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++; 
    } 

} 

Jetzt irgendwo in anderen .cpp-Datei (wo ich sowohl igraph.h und directed_graph.h enthalten) I do directed_graph myGraph = directed_graph(data, vertices). Dann möchte ich es mit print_matrix() und print_list() ausdrucken. Ich bekomme diese Fehler:

'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

Was ist hier falsch? Ich dachte, es sollte funktionieren, ich folge richtig meiner Meinung nach, aber dann was falsch ist

+0

Mögliches Duplikat von [C++ #include Wachen] (http://stackoverflow.com/questions/8020113/c-include-guards) –

Antwort

1

'igraph': 'class' type redefinition sollte Ihnen sagen, dass Sie class igraph neu definieren. Das liegt daran, dass Sie igraph.h zweimal einschließen; einen von Ihrer "anderen" .cpp-Datei und einmal von directed_graph.h. Sie haben eine #pragma once vergessen.

+0

Kann ich eigentlich '#pragma once' in einer' .cpp' Datei ? Ich habe die '# include' in' .h' Datei verschoben, da die problematische Zeile 'menu.cpp' ist und' menu.h' enthält, wo ich '#pragma once' habe. Aber das hat den Job, danke – Frynio

+0

nein, Sie haben vergessen, '#pragma einmal' in 'igraph.h' setzen –

+0

Sie haben Recht, genau – Frynio

0

Sie sollten Schutz für .h verwenden, damit Redefinition vermieden wird.

#ifndef _X_H_ 
#define _X_H_ 


.... 


#endif // _X_H_