VC ++ 2010 ошибка LNK2019: неразрешенный внешний символ - PullRequest
1 голос
/ 06 августа 2011

основной файл 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

так что в основном я много гуглил и не знаю что делать. Я нашел некоторые ответы, но я попробовал их и не помог

например, я пытался добавить дополнительные зависимости , но у меня все они уже добавлены.

помогите пожалуйста, почему появляется ошибка?

Ответы [ 5 ]

6 голосов
/ 06 августа 2011

Вы должны определить деструктор в вашем файле cpp:

Table::~Table()
{

}
3 голосов
/ 06 августа 2011

Хотя заголовок определяет 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 голосов
/ 06 августа 2011

неразрешенный внешний символ "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>.
}
1 голос
/ 06 августа 2011

Вы не определили деструктор, только объявили его. Попробуйте изменить заголовок на это:

#pragma once

class Table {
    public:
        char start[26];

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

        ~Table() {}
};
0 голосов
/ 06 августа 2011

Вы объявили деструктор, поэтому вы также должны определить его.

Подсказка в том, что ошибка компоновщика относится к деструктору.

  • Просто удалите объявление деструктора из определения класса: у вас все равно ничего нет.

И Джерри прав в вопросе инициализации вашего массива: на самом деле вы вообще не инициализируете этот массив, а создаете какой-то локальный в теле конструктора, который никогда не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...