主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了很多,不知道该怎么做。我找到了一些答案,但我尝试了它们并没有帮助
例如,我尝试添加其他依赖项,但我已经添加了所有这些依赖项。
请帮助我,为什么会出现错误?答案 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对你的数组初始化问题是正确的:你实际上根本没有初始化那个数组,而是在构造函数体中创建一个永远不会被使用的本地数据。