为什么在这段代码中使用共享指针会导致非法引用非静态成员错误? [关闭]

问题描述 投票:0回答:0

我有两个类

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
中找到的错误?据我所知,函数签名与标头中的声明没有区别?

我怀疑我遇到了这些问题,因为我通过共享指针让两个类共享“彼此的知识”的策略实施得很差。任何关于如何更好地实施这一点的建议也将不胜感激。

c++ header-files smart-pointers
© www.soinside.com 2019 - 2024. All rights reserved.