- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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::map
的first
(“key”)元素是const
,因为它们不能被改变。您不能在 const
对象上调用非 const
成员函数,因此会出现错误。
解决方案是将Vertex::get_name
声明为const
:char get_name() const
;这是一个告诉编译器 get_name()
不会改变对象的契约。
总的来说,这是一个很好的习惯。您应该始终将非变异成员函数声明为 const
,因为它允许编译器发现错误。
关于C++ 帮助解决编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522228/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!