我正在学习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方法。

07-28 01:26