繁体   English   中英

C ++帮助解决编译器错误

[英]C++ help with compiler error

我是C ++的新手,并且一直在尝试实现bellman ford算法,但是我的程序无法编译,但出现以下编译器错误,这是很隐秘的。

D:\ME\MCA\Sem2\LAB\DS\graph_algorithms>g++ bellman_ford.cpp -o bellman.exe
In file included from bellman_ford.cpp:8:0:
graph.h: In member function 'void Graph::print_distance_table()':
graph.h:172:31: error: passing 'const Vertex' as 'this' argument of 'char Vertex::get_name()' discards qualifiers

我正在使用的文件为graph.h:

#ifndef GRAPH_H
#define GRAPH_H

class Vertex
{
  private:
    char vertex_name;
  public:
    Vertex(){};

    Vertex(const char n)
    {
      vertex_name = n;
    }
//Method signatures
    char get_name(); 
//overloaded operators
    bool operator==(Vertex other) const
    {
      if(vertex_name == other.get_name())
      {
        return true;
      }
      else return false;
    }

    bool operator< (Vertex other) const
    {
      if(vertex_name - other.get_name() < 0)
      {
        return true;
      }
      else return false;
    }
};

class Edge
{
  private:
    Vertex source,destination;
    int weight;
  public:
    Edge(){};
    Edge(Vertex v1,Vertex v2,int w)
    {
      source = v1;
      destination = v2;
      weight = w;
    }

    //Method signatures
    Vertex get_source();
    Vertex get_destn();
    int get_weight();
};

class Graph
{
  private:
    list<Vertex> V;
    list<Edge> E;
    map<Vertex,int> distances;
  public:
    Graph(list<Vertex> vertex_list,list<Edge> edge_list)
    {
      V = vertex_list;
      E = edge_list;
    }

//     Method Signatures
     bool add_vertex(Vertex);
     bool remove_vertex(Vertex);
     bool add_edge(Edge);
     bool remove_edge(Edge);
     int total_vertices();
     int total_edges();
     void initialize_distances(Vertex);
     void print_distance_table();
};


/*
 * Methods for the Vertex class are defined first
 */

char Vertex::get_name()
{
  return vertex_name;
}


/*
 * Methods for the Edge class are defined next
 */

int Edge::get_weight()
{
  return weight;
}

Vertex Edge::get_destn()
{
  return destination;
}

Vertex Edge::get_source()
{
  return source;
}

/*
 * Methods for our Graph class
 */

bool Graph::add_vertex(Vertex u)
{
  V.push_back(u);
}

bool Graph::add_edge(Edge e)
{
  E.push_back(e);
}

//slightly more tricky will write code when it'll be required i.e. when i implement dfs or some other algo
//that requires addition and removal of edges and vertices
bool Graph::remove_vertex(Vertex u)
{
  //first check if it exists
  //when a vertex is removed then then all the edges that have it as either a source or a destination should also be removed
}

//
bool Graph::remove_edge(Edge e)
{
  //much easier than removing a vertex
  //check if the edge exists and if it does remove it from the list..
}

int Graph::total_edges()
{
  return E.size();
}

int Graph::total_vertices()
{
  return V.size();
}

void Graph::initialize_distances(Vertex source)
{
  distances.clear();
  for(list<Vertex>::iterator it=V.begin(); it != V.end();it++)
  {
    //todo : overload = for the class vertex
    if( *it == source)
    {
      distances[*it] = 0;
    }
    else
    {
      distances[*it] = INT_MAX;
    }
  }
}

void Graph::print_distance_table()
{
  map<Vertex,int>::iterator mit;
  for(mit = distances.begin(); mit != distances.end();mit++)
  {
    cout<<mit->first.get_name()<<"\t"<<mit->second<<endl; 
  }
}

#endif //GRAPH_H

和bellman_ford.cpp

#include<iostream>
#include<list>
#include<map>
#include<climits>

using namespace std;

#include "graph.h"

int main()
{
  Graph G = Graph(list<Vertex>(), list<Edge>());
  int vertices;
  cout<<"Enter the no. of vertices : ";
  cin>>vertices;

  for(int i=0;i<vertices;i++)
  {
    cout<<"Enter the name of the vertex( one character only ) : ";
    char tmp;
    cin>>tmp;
    Vertex tmp_vertex =  Vertex(tmp);
    G.add_vertex(tmp_vertex);
  }

  char choice;
  do
  {
    char tmp_src,tmp_destn;
    int tmp_w;
    cout<<"Enter edge( source, destn, weight)";
    cin>>tmp_src>>tmp_destn>>tmp_w;
    G.add_edge( Edge(Vertex(tmp_src),Vertex(tmp_destn),tmp_w) );

    cout<<"Add another edge (y|n)? ";
    cin>>choice;
  }while( choice != 'n');

  Vertex source_vertex;
  cout<<"\nEnter the source vertex : ";
  cin>>choice;
  source_vertex = Vertex(choice);
  G.initialize_distances(source_vertex);

  //now to iterate over the graph and compute the new shortest distances
  G.print_distance_table();


  return 0;
}

我对stl映射不是很熟悉,这似乎是graph.h文件的第172行中错误的来源。 如果我删除对mit-> first.get_name()的引用,那么它可以工作,但我也希望打印顶点名称。 我犯的那个错误是什么?

std::mapfirst (“键”)元素是const ,因为它们可能不会更改。 您不能在const对象上调用非const成员函数,因此会出现错误。

解决方案是将Vertex::get_name声明为constchar get_name() const 这是一个合同,告诉编译器get_name()不会更改对象。

通常,这是一个很好的习惯。 您应该始终将非变异成员函数声明为const ,因为它允许编译器发现错误。

您必须使用' const '限定符声明该方法:

const char* get_name() const;

顺便说一句,还有很多其他的事情是行不通的,但是我让你去发现...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM