VC ++ 2010错误LNK2019:未解析的外部符号

时间:2011-08-05 20:59:12

标签: c++ visual-studio visual-studio-2010 visual-c++

主cpp文件:

#include <iostream>
#include <cstdio>

#include "table.h"

using namespace std;

int main() {

    Table test;

    int i;
    for(i = 0; i < 26; i++) {
        cout << test.start[2] << endl;
    }

    system("PAUSE");
    return 0;
}

标题文件:

#pragma once


class Table {
    public:
        char start[26];

        Table();
        Table(char key[26]);

        ~Table();
};

cpp文件:

#include "table.h"


Table::Table() {
    char start[26] = "ABCDEFGHIJKLMNOPRSTUVWXYZ";
}

Table::Table(char key[26]) {

}

我得到的错误:

1>playfair.obj : error LNK2019: unresolved external symbol "public: __thiscall Table::~Table(void)" (??1Table@@QAE@XZ) referenced in function _main

1>c:\Users\Jansu\Documents\Visual Studio 2010\Projects\playfair\Debug\playfair.exe : fatal error LNK1120: 1 unresolved externals

所以基本上我google了很多,不知道该怎么做。我找到了一些答案,但我尝试了它们并没有帮助

例如,我尝试添加其他依赖项,但我已经添加了所有这些依赖项。

请帮助我,为什么会出现错误?

5 个答案:

答案 0 :(得分:6)

您必须在cpp文件中定义析构函数:

Table::~Table()
{

}

答案 1 :(得分:3)

虽然标题将Table定义为具有dtor,但cpp文件只包含几个构造函数 - 而不是析构函数。鉴于您的析构函数似乎没有任何内容(您没有分配任何动态内存或类似内容),您可能只想删除Table::~Table();的声明并完成它。当你在这里时,你可能想要Table::start私有。我还将参数更改为char const *,而不是使用数组表示法:

class Table {
        char start[26];
    public:
        Table();
        Table(char const *key);
};

完成此操作后,您需要处理Table::Table()定义名为start的局部变量并初始化它,但Table::start未初始化的事实,我怀疑你想要/想要的是什么。

答案 2 :(得分:2)

  

未解决的外部符号“public:__thiscall Table ::〜Table(void)”(?? 1Table @@ QAE @ XZ)在函数_main中引用

这正是它所说的内容。

“未解决”=“无法找到”。 “外部符号”=“函数的定义”。 它正在寻找析构函数 - 重要的部分是“Table ::〜Table”。

您的类定义是指析构函数,但不实现它。实现文件也没有。因为您引用了析构函数,所以编译器不会为您执行通常的自动执行操作。析构函数在main()中调用,因为你在main()中创建了一个实例,并且需要析构函数在main()的末尾清理它。

顺便说一下,你的构造函数实际上并没有初始化表中的数据。它会创建一个名为start本地数组,然后立即将其丢弃,让该成员独立。

您也无法从字符串中分配给数组成员。您需要使用复制功能,例如std :: copy:

Table::Table() {
    char* alphabet = "ABCDEFGHIJKLMNOPRSTUVWXYZ";
    std::copy(alphabet, alphabet + 26, start); // std::copy comes from <algorithm>.
}

答案 3 :(得分:1)

您还没有定义析构函数,只是声明了它。尝试将标题更改为:

#pragma once

class Table {
    public:
        char start[26];

        Table();
        Table(char key[26]);

        ~Table() {}
};

答案 4 :(得分:0)

您声明了析构函数,因此您也必须定义它。

提示是链接器错误引用析构函数。

  • 只需从类定义中删除析构函数声明:无论如何都没有任何内容。

Jerry对你的数组初始化问题是正确的:你实际上根本没有初始化那个数组,而是在构造函数体中创建一个永远不会被使用的本地数据。