我有两个类
Edge
和 Line
分别表示图形上节点之间的边和与该边关联的线,在我的程序上下文中,它是一个对象,它充当边的视觉表示并且是用于使用 GUI 库绘制“边缘”。我正在尝试找到一种方法,通过从 Edge
到 Line
和 Line
到 Edge
的指针将我的代码中的这两个对象链接起来,这些指针将存储在这些对象上。我想这样做,以便我可以在 Edge
对象上运行一些算法。每个 Line
对象对应于一个 Edge
具有一些属性,例如颜色,厚度等,这些属性由 GUI 绘图库绘制。
用法示例:
Edge e = Edge(); //create an edge
Line l = Line(e); //create a line and pass it the edge
创建的
edge
对象通过引用传递给 Line
的构造函数,然后设置指向该边的指针,并在 Edge 上设置指向该 Line 的指针,这样 Edge 和 Line 对每个边都有一些“知识”其他:
Line::Line(Edge& e)
{
pair<int, int> src = e.getSourceNode()->getXY();
pair<int, int> dest = e.getDestinationNode()->getXY();
point_a[0] = src.first;
point_a[1] = dest.first;
point_b[0] = src.second;
point_b[1] = dest.second;
colour_ = LineColours::GREY;
corresponding_edge_ = make_shared<Edge>(e);
e.setLine(make_shared<Line>(this));
};
我
Edge
课的相关部分如下所示:
//Edge.h
#pragma once
#include "node.h"
#include <iostream>
#include "iSubject.h"
#include <memory>
using namespace std;
class Node;
class Line;
class Edge {
private:
weak_ptr<Line> associated_line_;
public:
Edge();
Edge(Node* srcNode,Node* destNode, double w);
~Edge();
void setLine(shared_ptr<Line> l);
weak_ptr<Line> Line();
//Edge.cpp
using namespace std;
/**
* @brief Edge constructor
*
* @param destNode pointer to the destination Node
* @param w weight of the edge
*/
Edge::Edge(Node* srcNode, Node* destNode, double w)
{
sourceNode = srcNode;
destinationNode = destNode;
edgeWeight = w;
associated_line_;
};
Edge::Edge()
{
};
Edge::~Edge() {
}
void Edge::setLine(shared_ptr<Line> l) {
associated_line_ = l;
}
weak_ptr<Line> Edge::Line() {
return associated_line_;
};
我
Line
课的相关部分如下所示:
//Line.h
#pragma once
#include "ImPlot.h"
#include <utility>
#include <memory>
#include "edge.h"
using namespace std;
class Edge;
enum class LineColours {RED,BLACK, GREY};
class Line {
private:
float point_a[2] = {};
float point_b[2] = {};
float thickness_ = 2.0;
LineColours colour_;
weak_ptr<Edge> corresponding_edge_;
public:
Line();
Line(Edge& e);
~Line();
float* getPointA();
float* getPointB();
float lineThickness();
ImVec4 lineColour();
void setLineColour(LineColours color);
};
//Line.cpp
#include "line.h"
#include <memory>
using namespace std;
Line::Line() {
};
Line::Line(Edge& e)
{
pair<int, int> src = e.getSourceNode()->getXY();
pair<int, int> dest = e.getDestinationNode()->getXY();
point_a[0] = src.first;
point_a[1] = dest.first;
point_b[0] = src.second;
point_b[1] = dest.second;
colour_ = LineColours::GREY;
corresponding_edge_ = make_shared<Edge>(e);
e.setLine(make_shared<Line>(this));
};
Line::~Line() {
};
我已确保仅在
edge.h
标头中包含 line.h
并在 Line
中转发声明 edge.h
以避免循环引用。但是,当我编译这段代码时,出现以下错误,我很难理解这些错误:
在我的代码中,为什么
associated_line
被认为是对非静态成员的非法引用?如果我对带有 setter 的私有成员使用智能指针以外的类型,那么我不会遇到此错误。此外,为什么我会收到 setter 未在 Edge
中找到的错误?据我所知,函数签名与标头中的声明没有区别?
我怀疑我遇到了这些问题,因为我通过共享指针让两个类共享“彼此的知识”的策略实施得很差。任何关于如何更好地实施这一点的建议也将不胜感激。