未明确引用' class :: function'?

时间:2015-09-18 01:40:11

标签: c++ class oop object vector

好的,我仍然习惯于再次使用C ++,所以这个错误看起来很简单。我试图创建一个具有三个成员函数的简单类(我只是试图在其中调用其中一个)。所以我创建了类,实例化了一个对象,然后尝试使用该对象调用该函数,并出现此错误:

Code.cpp :(。text + 0x15):对`Code :: genCode()'

的未定义引用

我已经仔细检查过它是否是函数本身的错误,但事实并非如此。我已经看到其他人发布了关于这个问题的帖子,但似乎有很多情况和解决方案。无论如何,这里是代码:

#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <list>
using namespace std;

class Code {
    public:
        int genCode();
        int checkCorrect();
        int checkIncorrect();
};

int main()
{
    Code c1;
    c1.genCode();
}

////////////////FUNCTIONS/////////////////////////
int genCode()
{
    vector <int> newcode;
    srand(time(NULL));
    for(int i = 0; i < 9; i++){
        int x;
        x = (rand() % 6);
        if (find(newcode.begin(),newcode.end(), x) == newcode.end())
        {
            newcode.push_back(x);
        }
    }
    if (newcode.size() > 4)
    {
        newcode.pop_back();
    }
    for(int i = 0; i < 4; i++)
    {
        return newcode[i];
    }   
}

int checkCorrect()
{

}

int checkIncorrect()
{

}

4 个答案:

答案 0 :(得分:1)

您需要在方法名称

之前放置类名

格式是 'returnType Classname :: methodname { 代码 }“

int code::genCode()
{
    //codes
}

或者您也可以在课堂上编写代码

答案 1 :(得分:0)

将班级方法的实施更改为以下内容:

int Code::genCode()
{
...
}

int Code::checkCorrect()
{
...
}

int Code::checkIncorrect()
{
...
}

答案 2 :(得分:0)

您正在定义课外的功能。把它们放在类中,然后你不需要在类中声明它们。直接定义它们。

johnsonsam -> ['johnson', 'sam']
samjohnson -> ['sam', 'johnson']
sjohnson -> ['s', 'johnson']
john -> ['john']
johnson_sam -> ['johnson', 'sam']

输出:

内部genCode。仅用于调试目的。

答案 3 :(得分:0)

功能

int genCode()

是什么叫做自由功能。它不受一个类的约束。

为了让编译器知道genCode是类的一部分,你必须通过明确说明genCode所属的命名空间来告诉它。

int Code::genCode()

然而,由于代码代码完全包含在一个文件中,因此遵循CodeRunner的建议将导致更清晰的实现。

但是为什么有人想要把所有东西分开呢?

将类定义与方法实现分开允许您将类定义放在一个文件中,'h头文件和实现文件中的方法,通常是.cpp文件。然后,头文件与Code对象的用户共享,并且实现文件可以编译到库中并从调用者视图中隐藏。

有很多理由可以做到这一点,但大多数都与创建预编译库和使用它们减少构建时间有关。

使用库,您可以构建一次库,然后一遍又一遍地编译使用该库的其余代码,直到您正确完成。您是否可以想象如果每次修复错误并想要测试时必须重建C ++标准库,那么构建程序需要多长时间?

曾经有过这样的工作。每次我修复时都要花四个小时编译第三方网络代码,因为公司的偏执构建系统每次都会重建所有内容。关闭一个错误? 4个小时。需要添加调试线吗? 4个小时。您可以每天制作并测试三项更改。当然,你可以批量修复一堆修复,但如果一个修复失败并打破了系统,那是哪一个?迟早你会被缩小到一个爬行,一次调整,构建,测试,分析一个。幸运的是,我正在签订合同并按小时付款。

另一个很好的例子是您可以拥有一个支持Windows的库以及支持QNX和其他操作系统的其他库。所有都使用相同的标题,用户可以编写一个程序,理论上,只需重新编译用户的代码就可以在所有支持的平台上运行。它永远不会那么干净,但人们可以梦想。

甚至可以用更新的库替换库,而无需更改或编译用户代码,并且可以根据不同需求存在库的不同变体。例如,带有额外日志记录的调试版本。

也许这种实施不适合公众的目光。用户可以看到库中的标题和调用函数,但不多了。