0

我正在学习 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个文件:

  • 主文件
  • 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;
}

类1.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 进行开发。

4

1 回答 1

2

应该:

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

于 2013-10-14T14:27:01.947 回答