C++ c++;类实例错误lnk2019

C++ c++;类实例错误lnk2019,c++,C++,我搜索了我的问题超过3个小时,但没有找到任何关于我的好文章,所以决定在这里发布一个问题,征求您的意见。我的问题是我不明白课堂是如何运作的。它只是一个简单的类,但有一个类不起作用。首先,下面是有效的代码 class R{ int x, y; public: R(); R(int a, int b) : x(a), y(b) {}; void setX(int a){ x = a; } void setY(int b){ y = b; } int g

我搜索了我的问题超过3个小时,但没有找到任何关于我的好文章,所以决定在这里发布一个问题,征求您的意见。我的问题是我不明白课堂是如何运作的。它只是一个简单的类,但有一个类不起作用。首先,下面是有效的代码


class R{
    int x, y;
public:
    R();
    R(int a, int b) : x(a), y(b) {};
    void setX(int a){ x = a; }
    void setY(int b){ y = b; }
    int getX(){ return x; }
    int getY(){ return y; }
    void display();
};
void R::display(){
// displaying x and y I removed the function because it somehow remove the rest of the code after arrow operator
}
int main(){
    R r(2,3);
    r.setX(1);
    r.setY(2);
    r.display();
}
但是当我像这样改变主管道时,它就不起作用了


int main(){
    R r;
    r.setX(1);
    r.setY(2);
    r.display();
}
我首先想到的原因可能是,我实际上并没有创建一个实例,但在一个网站上找到了一个运行良好的代码。代码是这样的:


// overloading operators example
#include 
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int a,int b) : x(a), y(b) {}
    CVector operator + (const CVector&);
};

CVector CVector::operator+ (const CVector& param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return temp;
}

int main () {
  CVector foo (3,1);
  CVector bar (1,2);
  CVector result;
  result = foo + bar;
// displaying x and y I removed the function because it somehow remove the rest of the code after arrow operator
  return 0;
}
它还制作了一个实例“CVector temp”而不是“CVector temp(2,3)”,但在我的实例不工作时,它运行良好

如果有人知道我遗漏了什么以及我的代码的问题,你能给我你的建议吗

感谢您的阅读和宝贵时间

R();
它是
构造函数的声明。你必须给你使用的每个方法一个定义,同时给它一个主体(即使主体像这里一样是空的)。对于类方法,要么像这里在类中那样提供主体,要么可以在源(.cpp)文件中单独定义主体,如

R::R(){/*your code*/}
它类似于
CVector CVector::operator+
当你像这样写的时候。

R();
它是
构造函数的声明。你必须给你使用的每个方法一个定义,同时给它一个主体(即使主体像这里一样是空的)。对于类方法,要么像这里在类中那样提供主体,要么可以在源(.cpp)文件中单独定义主体,如

R::R(){/*your code*/}
它类似于
CVector CVector::operator+

从您的评论中,我可以推测该错误与缺少
R::R()
的定义有关

MSVC的
错误LNK2019
表示未解析的符号。符号是已声明但未定义的任何函数、对象、变量或类型

在本例中,我猜想您从未提供过
R::R()
的定义,但您在类定义中编写了它,它告诉编译器它在某个地方——这就是声明

但是,很显然,你从未定义过它。 添加
{}
提供了函数的主体,这就是它使用大括号的原因

您还可以像在外部定义
R::display()
一样定义
R::R()
,或者,如果编译器支持C++11,则显式编写
R::()=default


一旦你给了链接器一个函数体,你的代码应该链接得很好。

从你的评论中,我可以推测这个错误与缺少
R::R()
的定义有关

MSVC的
错误LNK2019
表示未解析的符号。符号是已声明但未定义的任何函数、对象、变量或类型

在本例中,我猜想您从未提供过
R::R()
的定义,但您在类定义中编写了它,它告诉编译器它在某个地方——这就是声明

但是,很显然,你从未定义过它。 添加
{}
提供了函数的主体,这就是它使用大括号的原因

您还可以像在外部定义
R::display()
一样定义
R::R()
,或者,如果编译器支持C++11,则显式编写
R::()=default


一旦你给链接器一个函数体,你的代码应该链接良好。

你需要有一个默认构造函数。

你需要有一个默认构造函数。

错误文本可能重复吗?“未解析的外部符号
中…”好的,我发现如果我使用大括号(如“R(){}”)来定义构造函数,它是可以工作的,但仍然不明白为什么它需要在这里。如果有人知道,你能教我吗?谢谢你的快速评论@麦克斯:我刚刚注意到,有些代码在我键入时无法显示,因为您需要默认构造函数,所以您需要一个定义。目前您只有一个声明。如果它不起任何作用,您也可以删除它,编译器将为您生成一个。错误文本可能是什么?“未解析的外部符号
中…”好的,我发现如果我使用大括号(如“R(){}”)来定义构造函数,它是可以工作的,但仍然不明白为什么它需要在这里。如果有人知道,你能教我吗?谢谢你的快速评论@麦克斯:我刚刚注意到,有些代码在我键入时无法显示,因为您需要默认构造函数,所以您需要一个定义。目前您只有一个声明。如果它没有任何作用,您也可以删除它,编译器将为您生成一个。非常感谢Max!!它真的解决了我的问题,这就是我想知道的答案!非常感谢。不知怎的,它说我需要在2分钟后检查这个答案,所以在那之后,我会检查这个作为答案。非常感谢。非常感谢你,麦克斯!!它真的解决了我的问题,这就是我想知道的答案!非常感谢。不知怎的,它说我需要在2分钟后检查这个答案,所以在那之后,我会检查这个作为答案。非常感谢。谢谢你的回答,Rakibul!虽然Max的考试成绩很好,但我认为你的答案很简单,很好理解,所以我会推广它!谢谢你的回答!现在我感觉好多了!谢谢你的回答,Rakibul!虽然Max的考试成绩很好,但我认为你的答案很简单,很好理解,所以我会推广它!谢谢你的回答!现在我感觉好多了!谢谢你的回答,阿玛纳利!现在我想我必须给它下个定义。非常感谢。谢谢你的回答,阿玛纳利!现在我想我必须给它下个定义。Th