Программа C ++ не будет собираться. Получение неопределенных символов для ошибки архитектуры

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 файла в проекте:

  • main.cpp
  • karavites_william_oct7_homework.cpp
  • karavites_william_oct7_homework.h

У меня есть функции и класс, определенные в файле заголовка, и простой метод в файле 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 для разработки.

Теги:
architecture
linker
gcc
build

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.

  • 0
    То есть имя класса + :: должно быть включено в каждое объявление метода?
  • 0
    Поскольку вы хотите, чтобы этот метод принадлежал классу, то во время его реализации вы должны как-то явно указать его, иначе компилятор считает, что это всего лишь глобальная функция printerr .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню