Проблемы с функциями в классах C ++ (ошибки LNK2019 & LNK1120) - PullRequest
0 голосов
/ 21 февраля 2020

Я работал над проектом для моего класса колледжа, который использует классы на c ++, к сожалению, каждый раз, когда я пытаюсь вызвать функцию, которой передают параметры в моем классе, программа не может скомпилировать с двумя следующими ошибками:

Ошибка LNK2019: неразрешенный внешний символ "int __cdecl binsearch (класс Course * * const, int, char * const)" (? Binsearch @@ YAHQAPAVCourse @@ HQAD@Z), на который имеется ссылка в функции _main Project1 C : \ Users \ cvos \ source \ repos \ Project1 \ Project1 \ courses_main.obj 1

и

Ошибка LNK1120 1 неразрешенных внешних объектов Project1 C: \ Users \ cvos \ source \ repos \ Project1 \ Debug \ Project1.exe 1

Я рассмотрел проблемы LNK, и большинство результатов показывают, что это связано с символами в c ++ против c (Это исправление) не работает) или что существует проблема со связыванием файлов в пределах Visual Studio (это исправление также не сработало), и, наконец, это было связано с необходимостью быть в консольной подсистеме (Wh ich это уже было).

Странно то, что, если я закомментирую свои вызовы всех функций, которые я сделал в классе «Курс» и которым передаются параметры, программа работает нормально. Только когда я пытаюсь использовать функции, созданные в классе «Курс», программа не запускается, из-за чего я сильно подозреваю, что я делаю что-то не так с тем, как я передаю переменные своим функциям-членам.

Я опубликую соответствующие части моего кода:

В моем заголовочном файле "courses.h" я объявляю свою функцию:

int binsearch(Course* co_ptr[], int size, char search[]);

В моем втором исходном файле "courses_functions . cpp "Я определяю функцию:

int Course::binsearch(Course* co_ptr[], int size, char search[])
{
    int low = 0, high = size - 1, first_index = -1, last_index = -1, num_of_entries = 0;

    while (low <= high)
    {
        int mid = (low + high) / 2;

        if (co_ptr[mid]->name == search)
        {
            bool found = false;
            int i = mid;

            while (!found) //Check values below mid
            {
                if (co_ptr[i]->name == search)
                {
                    first_index = i; //first_index now holds a potential first occurence of our name
                    if (i == 0)
                    {
                        found = true;
                    }
                }
                else
                {
                    found = true;
                }

                i--; //decrement i and check again.
            }

            i = mid; //Reset i
            found = false; //Reset found

            while (!found) //Check values above mid
            {
                if (co_ptr[i]->name == search)
                {
                    last_index = i; //last_index now holds a potential last occurence of our name
                    if (i == size - 1)
                    {
                        found = true;
                    }
                }
                else
                {
                    found = true;
                }

                i++; //increment i and check again.
            }
            break; //Breaks us out of the main while loop
        }
        else if (co_ptr[mid]->name < search)
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
        }
    }

    if ((first_index != -1) && (last_index != -1))
    {
        for (int i = first_index; i <= last_index; i++)
        {
            std::cout << "\nEntry found: "
                << std::endl << co_ptr[i]->name << ' ' << co_ptr[i]->units << " units, grade:" << co_ptr[i]->grade;
            num_of_entries++;
        }
        return num_of_entries;
    }
    else
    {
        std::cout << "\nEntry not found.";
        return num_of_entries;
    }
}

Наконец, в моем основном исходном файле" courses_main. cpp "Я вызываю функцию:

else if (selection == 3) //Display a course
        {
            char title[50] = "";
            int results = 0;

            std::cout << "\nEnter a class to search for: ";
            std::cin.getline(title, 50, '\n');
            std::cin.ignore();
            results = binsearch(courses, size, title);
        }

Как это для класс колледжа, я не собираюсь использовать какие-либо альтернативные методы, я в основном пытаюсь выяснить, почему метод, который я использую, вернул бы ошибки, о которых я рассказывал выше, но я с удовольствием выложу больше фрагментов своего кода, если он необходимо.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Нужно увидеть декларацию вашего файла "courses.h". Возможно, вы объявили binsearch за пределами вашего Course объявления класса. В этом случае вы получите ошибку компоновщика, как уже упоминалось. Исходя из вашего использования в main .. ваша реализация этой функции не обязательно должна быть в классе Course, она может быть автономной функцией вне класса Course. как только вы переместите определение своей функции за пределы Course класса, ваш компоновщик должен go удалиться, при условии, что у вас есть файлы courses_functions. cpp и courses_main. cpp в том же проекте в вашей MSV C IDE.

0 голосов
/ 21 февраля 2020

Причина почти наверняка одна из следующих:

  1. Вы не компилируете файл реализации (просто используете заголовок в другом месте).
  2. Вы компилируете реализацию , но не использует скомпилированный объект при связывании объектов в исполняемом файле.
  3. У вас есть небольшое несоответствие в именовании, например, использование binsearch() не в контексте класса или использование немного другой подписи каким-либо образом (не скорее всего, даете то, что вы нам сказали).
...