我正在学习C ++,并且正在上课。
我以为我已经正确地创建了所有内容,但是当我尝试清理/构建代码时,我得到了一个错误:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
rm -f -r build/Debug
rm -f dist/Debug/GNU-MacOSX/hw4
CLEAN SUCCESSFUL (total time: 57ms)
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/hw4
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o.d
g++ -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o.d -o build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o karavites_william_oct7_homework.cpp
karavites_william_oct7_homework.cpp: In function 'void insertAtEnd(int)':
karavites_william_oct7_homework.cpp:85: warning: NULL used in arithmetic
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/main.o.d
g++ -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp
mkdir -p dist/Debug/GNU-MacOSX
g++ -o dist/Debug/GNU-MacOSX/hw4 build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o build/Debug/GNU-MacOSX/main.o
Undefined symbols for architecture x86_64:
"BookList::printerr()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-MacOSX/hw4] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 469ms)
我在项目中有3个文件:
main.cpp
karavites_william_oct7_homework.cpp
karavites_william_oct7_homework.h
我有在头文件中定义的函数和类,并在类(class.cpp)文件中有一个简单的方法,该方法只打印出一个字符串以测试所有内容。
这是调用/创建该类的主文件:
#include <cstdlib>
#include "karavites_william_oct7_homework.h"
#include <iostream>
using namespace std;
using std::cout;
using std::cin;
int ch;
/*
*
*/
int getNum(int cho) {
int ans;
switch (cho) {
case 1: cout << "Please type in the ISBN you wish to search\\insert\\delete\n";
cin >> ans;
break;
case 2: cout << "Please type in the position of the element you wish to delete/insert\n";
cin >> ans;
break;
}
return ans;
}
int main(int argc, char** argv) {
BookList bl;
bl.printerr();
return 0;
}
class1.h
/*
* File: karavites_william_oct7_homework.h
* Author: willkara
*
* Created on October 7, 2013, 9:21 PM
*/
#ifndef KARAVITES_WILLIAM_OCT7_HOMEWORK_H
#define KARAVITES_WILLIAM_OCT7_HOMEWORK_H
#include <vector>
class BookList {
public:
BookList();
void insertAtEnd(int new_element);
void insertAtLocation(int new_element, int pos);
int linSearch(int isbn);
int binSearch(int element);
void deleteByPosition(int position);
void deleteByItem(int item);
void printerr();
void print();
int menu();
int countCurrent();
void bubbleSort();
void fixNulls();
void selectionSort();
private:
static int lSize;
int bList[20];
bool sorted;
int p;
};
#endif /* KARAVITES_WILLIAM_OCT7_HOMEWORK_H */
booklist类有很多方法,但是我什至无法得到一个简单的方法来打印一行代码。
#include "karavites_william_oct7_homework.h"
#include <iostream>
using namespace std;
using std::cout;
using std::cin;
int bList[20];
int lSize = 20;
bool sorted;
int c;
BookList::BookList() {
}
void printerr() {
cout << "I will hopefully work this time.\n";
}
我在某处缺少声明吗?我正在Mac OSX 10.7.5上使用NetBeans 7.3.1进行开发。
最佳答案
应该:
void BookList::printerr() {
cout << "I will hopefully work this time.\n";
}
注意
BookList::
,即您忘记了在实现/定义过程中指定该方法所属的类。结果,编译器认为这只是全局函数printerr
,但是您在main
内部将其称为类方法,因此,编译器在链接阶段无法找到BookList::printerr
的实现并报告错误。关于方法的重要说明(您已经在注释中混合了),方法的声明是这样的:
class BookList {
...
void printerr();
...
};
即该方法只是声明的,未定义/实现的。
方法的定义/实现是这样的:
void BookList::printerr() {
...
}
这完全是声明和定义/实现:
class BookList {
...
void printerr() {
...
}
...
};
在这种情况下,您无需指定
BookList::
,因为编译器已经知道您在printerr
类中定义/实现了BookList
方法。