Проблема с тем, как объявить (или определить) функцию в заголовке - PullRequest
0 голосов
/ 14 февраля 2020

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

Я пытаюсь сделать функцию 'sort_name', которая сортирует массив приватных классов, основанный на c-string "name" при вызове функции.

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

Вот моя основная функция courses_main.cpp's:

int main()
{
    Course* courses[10] = {};
    int selection;

    int size = 0;
    do
    {
        selection = menu();

        if (selection == 1)
        {
            if (size < 10)
                add(courses, size);
            else
                std::cout << "\nUnable to add more classes.";
        }
        else if (selection == 2)
        {
            edit(courses, size);
        }
        else if (selection == 3)
        {

        }
        else if (selection == 4)
        {
            sort_name(courses, size);
            for (int i = 0; i < size; i++)
            {
                courses[i]->display();
            }
        }
        else if (selection == 5)
        {

        }
        else if (selection == 6)
        {

        }
        else if (selection == 7)
        {
            break;
        }
        else
        {
            std::cout << "\nInvalid selection.";
        }
    } while (selection != 7);

    std::cout << "\nPress any key to exit.";
    (void)_getch();
    return 0;
}

Вот мой courses_functions.cpp, где я определяю функцию sort_name:

void swap_ptrs(Course*& pt1, Course*& pt2) //Passes the pointers by reference
{
    Course* tmp = pt1;
    pt1 = pt2;
    pt2 = tmp;
}

void Course::sort_name(Course* co_ptr[], int size) //has to be apart of the class (Course::) to have access to the name data
{
    bool swap;

    do
    {
        swap = false;
        for (int i = 0; i < size - 1; i++)
        {
            if (strcmp(co_ptr[i]->name, co_ptr[i + 1]->name) > 0) //We're now comparing and swapping pointers
            {
                swap_ptrs(co_ptr[i], co_ptr[i + 1]);
                swap = true;
            }
        }
    } while (swap);
}

А вот мой заголовок courses.h, где я определяю (?) Функцию:

#ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <ctime>
#include <fstream>
#include <cstdlib>


class Course
{
private:
    char name[10] = "", grade;
    int units;
public:
    Course()
    {
        name;
        grade;
        units = 0;
    }

    void read() //Initializes course and collects information from user
    {
        std::cout << "\nEnter course name: ";
        std::cin.getline(name, 10, '\n');
        std::cout << "\nEnter number of units: ";
        std::cin >> units;
        std::cout << "\nEnter grade received: ";
        std::cin >> grade;
        std::cin.ignore();
    }

    void display() const //Displays course to user
    {
        std::cout << name << ' ' << units << ' ' << grade << std::endl;
    }

    ~Course() //Destructor frees allocated dynamic memory
    {
        std::cout << "\nDeleting any dynamically created object";
    }

    void sort_name(Course* co_ptr[], int size);
};

#endif // COURSE_H

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

1 Ответ

1 голос
/ 15 февраля 2020

Лучшей организацией кода было бы объявление функций в файле .h и их реализация в .cpp.

Вот рабочий образец без .cpp для упрощения. Только Courses.h и main.

С .cpp ваша программа должна выглядеть примерно так:

Course.h

#ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;  //<-- for test pusposes, you should use std:: scope

class Course
{
private:
    string name;
    int units, grade;

public:
    Course(); //<-- the code you have inside the constructor, only units = 0, 
              // does somenthing, you should initialize all the members.
    Course(string name);
    void read();
    void display() const;
    ~Course(); //<-- to dealocate dynamic memory you need to really dealocate it with delete.
    string getName() const;
};

#endif // COURSE_H

И в вашей .ccp реализации:

Course. cpp

#include "Course.h"

Course::Course(){ /*do stuff*/ }

Course::Course(string name) : name(name) { /*do stuff*/ } //<-- initializing name here

void Course::read() {/*do stuff*/ }

void Course::display() const {/*do stuff*/ }

Course::~Course() {/*do stuff*/ }

string Course::getName() const { return name; }

Для сортировки вам не нужно ничего особенного, у вас есть инструменты сортировки и структуры данных в библиотеках C ++, которые упрощают вашу работу, например vector для контейнера объектов и sort для сортировки.

Main

#include "Course.h"

 bool sorting(Course course1, Course course2) { //conditional function for sort (#include <algorithm>)
    return course1.getName() < course2.getName();
}

int main() {

    vector<Course> courses = { Course("zed"), Course("albert")}; // adding courses
    courses.push_back(Course("mary")); // adding some more
    courses.push_back(Course("john"));
    courses.push_back(Course("ana"));
    courses.push_back(Course("charles"));

    sort(courses.begin(), courses.end(), sorting); //<-- sorting

    for (Course c : courses) {
        cout << c.getName() << " ";
    }
}

Вывод:

albert ana charles john mary zed
...