Я изучаю 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 файла в проекте:
У меня есть функции и класс, определенные в файле заголовка, и простой метод в файле class (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";
}
Я где-то пропустил декларацию? Я использую NetBeans 7.3.1 для Mac OSX 10.7.5 для разработки.
Должно быть:
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
.
printerr
.