繁体   English   中英

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

[英]VC++ 2010 error LNK2019: unresolved external symbol

主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

所以基本上我用谷歌搜索很多,不知道该怎么办。 我找到了一些答案,但我尝试了但没有帮助

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

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

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

Table::~Table()
{

}

尽管标头将Table定义为具有dtor,但cpp文件仅包含几个构造函数-不含析构函数。 鉴于您的析构函数似乎无事可做(您尚未分配任何动态内存或类似的东西),您可能只想删除Table::~Table();的声明Table::~Table(); 并完成它。 在使用它时,您可能希望将Table::start设为私有。 我还将参数更改为char const *而不是使用数组符号:

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

处理完之后,您将需要处理Table::Table()定义一个名为start的局部变量并对其进行初始化的事实,但是将Table::start保留为未初始化的事实,我怀疑这是您的实际情况。想要/打算。

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

这就是说的意思。

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

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

顺便说一句,您的构造函数实际上并未初始化表中的数据。 它创建一个名为start本地数组,然后立即将其丢弃,使成员保持独立。

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

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

您尚未定义析构函数,仅对其进行了声明。 尝试将标头更改为此:

#pragma once

class Table {
    public:
        char start[26];

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

        ~Table() {}
};

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

提示在于链接器错误引用了析构函数。

  • 只需从类定义中删除析构函数声明:无论如何,您什么都没有。

杰里(Jerry)对您的数组初始化问题是正确的:实际上,您根本不初始化该数组,而是在构造函数主体中创建一些从未使用过的本地数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM