如何在标头中声明(或定义)函数的问题
Posted
技术标签:
【中文标题】如何在标头中声明(或定义)函数的问题【英文标题】:Trouble with how to declare (or define) a function in a header 【发布时间】:2020-02-14 19:31:25 【问题描述】:我正在努力实现我在我的 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
除了与结构非常相似之外,我对类的了解不多,因此欢迎任何方向,谢谢!
【问题讨论】:
您遇到什么错误?你有必要的#include
行吗?
在提供的代码中,您的 .cpp
文件没有 #include
您的标头,因此编译器不会知道有关内部声明的任何信息。
是的,我在所有文件中都有相同的包含行,不知道为什么我的复制粘贴没有保留它们。我收到链接器工具错误 LNK2019
如果你能粘贴一些错误的确切文本会有所帮助
如果它们完全相同,那么您仍然没有在.cpp
文件中包含“courses.h”,但我预计在这种情况下会出现编译器错误。该链接器错误指向您不包括您的项目中的.cpp
文件之一。
【参考方案1】:
更好的代码组织方式是在.h
文件中声明函数并在.cpp
中实现它们。
为了简化,这里是一个 working sample,没有.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
中实现:
课程.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
。
主要
#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
【讨论】:
以上是关于如何在标头中声明(或定义)函数的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义授权方 AWS lambda 函数中访问 http 标头