【问题标题】:Operator ( == ) overloading error运算符 ( == ) 重载错误
【发布时间】:2014-05-13 17:16:44
【问题描述】:

所以,我正在处理一个流程图项目(OOP),我需要为 GUI 实现一个条件以让用户 DrawConnector,但“连接器”的条件是只有当你有 2 个时才能绘制其他“形状”(钻石/矩形/等)。

所以这是连接器类.h

    class Connector
{
protected :
    Point start;
    Point end;
    Statement *St;
    bool DrawCondition;
    bool DelCondition;
public :
    Connector();
    virtual void setStart(Point S); //Not a condition to be virtuals
    virtual void setEnd(Point E);
    virtual void DrawConnector(Output* pOut);
    //virtual bool setDrawCondition ();
    friend bool operator == (Point P, Point T);
};

我实际上想在运行时通过鼠标“点击”的值“setStart”和“setEnd”,然后检查这些点是否在一个形状上,所以它绘制连接器,如果不是,然后什么都没有发生。

void Connector::setStart(Point S)
{
    if (S == St->getPoint())
        {start = S;}
    else return;
}

void Connector::DrawConnector(Output *pOut)
{
    /*if (DrawCondition == true)*/
        pOut->DrawConnector(start.x,start.y,end.x,end.y);
}

您会注意到我重载了运算符“==”以检查是否已读取这些点...但它最终给了我这个编译错误!

错误 3 错误 LNK2019:未解析的外部符号“bool __cdecl operator==(struct Point,struct Point)”(??8@YA_NUPoint@@0@Z) 在函数“public: virtual void __thiscall Connector::setStart”中引用(结构点)" (?setStart@Connector@@UAEXUPoint@@@Z) C:\Users\Cereal Killer\Downloads\Phase1-Code\Phase1-Code\Connector.obj

编辑

对不起各位,我忘了说我已经在另一个文件中定义了重载,但我想这是问题所在,但为什么不是“全局函数”?

这是定义。 :

bool operator == (Point P, Point T)
{
    if ( (P.x == T.x) && (P.y == T.y) )
        return true;
    else return false;
}

还有一件事,如果我想从 GUI 形状“DrawRectangle、DrawCircle 等”检查给定的 POINT 是否在形状上。我怎样才能“追踪绘制形状的点”?还是有别的办法?

【问题讨论】:

  • 您对== 的实际定义是什么样的?
  • 运算符 == 的定义在哪里?

标签: c++ operator-overloading operator-keyword


【解决方案1】:

你已经声明了

friend bool operator == ( Point P, Point T);

但尚未定义。

你需要一个定义

bool operator == ( Point P, Point T) {
    //...
}

【讨论】:

  • 我已经在另一个文件中声明它是一个全局函数! [代码] bool operator == (Point P, Point T) { if ( (P.x == T.x) && (P.y == T.y) ) return true;否则返回假; } [/code]
  • 你必须链接到这个文件,即:g++ main.cpp other.cpp
【解决方案2】:

您需要像任何函数一样定义运算符,而不仅仅是声明。缺少它会产生这个错误。既然是友元,就只是一个全局函数,需要在类外部定义这个。在标头中,或在适当的 .cpp 文件中。

bool operator==(Point P, Point T) {
  return P.x == T.x && P.y == T.y;
}

您也可以考虑通过 const 引用而不是值来传递点。

【讨论】:

  • 我已经在另一个文件中完成了,这就是问题所在。感谢您的帮助。
  • @user3054349:NP。您必须在构建设置中链接到该文件(如果您使用的是 VS,则只需在解决方案中包含 .cpp 文件)。或者将该函数定义放在你的头文件中。
猜你喜欢
  • 2013-11-14
  • 2016-10-18
  • 1970-01-01
  • 2017-08-10
  • 2015-07-04
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多