Использование пространства имен приводит к ошибке «неопределенная ссылка» - PullRequest
0 голосов
/ 26 ноября 2018

Я изучаю C ++ из книги Стивена Прата "C ++ Primer Plus", и в настоящее время я делаю упражнение с пространствами имен.Вот как должна работать программа упражнений:

Первый файл должен быть заголовочным файлом, который содержит пространство имен.Второй файл должен представлять собой файл исходного кода, который расширяет пространство имен, предоставляя определения для трех функций-прототипов.Третий файл должен объявить два объекта продаж.Он должен использовать интерактивную версию setSales () для предоставления значений для одной структуры и неинтерактивную версию setSales () для предоставления значений для второй структуры.Он должен отображать содержимое обеих структур с помощью showSales ().

Я написал два файла cpp и один заголовочный файл.Я заранее прошу прощения за мой код спагетти.Пожалуйста, имейте в виду, что я только начинающий.Вот все мои файлы.

sales.h

#ifndef SALES_H_
#define SALES_H_

namespace SALES
{
    const int QUARTERS = 4;
    struct Sales {
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };
    // copies the lessoer of 4 or n items from the array ar
    // to the sales member of s and computes and stores the
    // average, maximum, and minimum values of the entered items;
    // remaining elements of sales, if any, set to 0
    void setSales(Sales & s, const double ar[], int n);
    // gathers sales for 4 quarters interactively, stores them
    // in the sales member of s and computes and stores the
    // average, maximum, and minimum values
    void setSales(Sales & s);
    // display all information in structure s
    void showSales(const Sales & s);
}

#endif

sales.cpp

#include <iostream>
#include "sales.h"

using namespace SALES;

void setSales(Sales & s, const double ar[], int n) {
    double tmp;
    double tmp_ar[n];
    //making temporary copy of an array
    for(int i = 0; i < QUARTERS; i++) {
        tmp_ar[i] = ar[i];
    }
    //bubble sort
    for(int i = 0; i < n; i++){
        for(int j = i + 1; j < n; j++){
            if(tmp_ar[i] > tmp_ar[j]){
                tmp = tmp_ar[i];
                tmp_ar[i] = tmp_ar[j];
                tmp_ar[j] = tmp;
            }
        }
    }
    //filling s.sales with 4 lesser elements
    for(int i = 0; i < QUARTERS; i++) {
        s.sales[i] = tmp_ar[i];
    }

    //finding and assigning minimum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++) {
        if(s.sales[i] < s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.min = tmp;

    tmp = s.sales[0];
    //finding and assigning maximum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++){
        if(s.sales[i] > s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.max = tmp;

    //calculating average
    double tmp_sum = 0;
    for(int i = 0; i < QUARTERS; i++) {
        tmp_sum += s.sales[i];
    }
    s.average = tmp_sum / QUARTERS;
}
void setSales(Sales & s) {
    using std::cin;
    using std::cout;
    using std::endl;
    cout << "Input sales for each quarter" << endl;
    double input;
    for(int i = 0; i < QUARTERS; i++) {
        cout << "Input sales for " << i + 1 << " quarter: ";

        while(!(cin >> input)) {
            cout << "Not an integer. Try again..." << endl;
        }
        s.sales[i] = input;
    }
    //temporary value for maximum and minimum
    double tmp;
    //finding and assigning minimum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++) {
        if(s.sales[i] < s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.min = tmp;

    tmp = s.sales[0];
    //finding and assigning maximum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++){
        if(s.sales[i] > s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.max = tmp;

    //calculating average
    double tmp_sum = 0;
    for(int i = 0; i < QUARTERS; i++) {
        tmp_sum += s.sales[i];
    }
    s.average = tmp_sum / 4;
}
void showSales(const Sales & s) {
    using std::cin;
    using std::cout;
    using std::endl;
    for(int i = 0; i < QUARTERS; i++)
        cout << "Quarter " << i + 1 << ": " << s.sales[i] << endl;

    cout << "Minimum: " << s.min << endl;
    cout << "Maximum: " << s.max << endl;
    cout << "Average: " << s.average << endl;
}

main.cpp

#include <iostream>
#include "sales.h"

using namespace SALES;

int main() {
    Sales year_one, year_two;
    setSales(year_one);
    showSales(year_one);
    int arr_size = 4;
    double arr[arr_size] = {400., 500., 200., 1000.};
    setSales(year_two, arr, arr_size);
    showSales(year_two);
    return 0;
}

Когда яскомпилировать я получаю ошибку:

sloth@sloth-commodore64:~/Programming/C++/src/Chapter9Exercise/ex4$ g++ main.cpp sales.cpp 
/tmp/ccl6q4PO.o: In function `main':
main.cpp:(.text+0x34): undefined reference to `SALES::setSales(SALES::Sales&)'
main.cpp:(.text+0x43): undefined reference to `SALES::showSales(SALES::Sales const&)'
main.cpp:(.text+0x152): undefined reference to `SALES::setSales(SALES::Sales&, double const*, int)'
main.cpp:(.text+0x15e): undefined reference to `SALES::showSales(SALES::Sales const&)'
collect2: error: ld returned 1 exit status

Я также сделал еще один main.cpp только для тестирования.Эта версия моего кода не использует ни нескольких файлов, ни пространств имен, и кажется, что она работает.

Я действительно смущен, почему она не работает.Я искал и stackoverflow, и google, но не могу найти решение.

Редактировать: Благодаря @Justin и @OznOg я нашел решение.В файле ~ / sales.h / я добавил префикс с пространством имен SALES.Теперь ~ / sales.h / выглядит примерно так:

sales.h

#include <iostream>
#include "sales.h"

using namespace SALES;

void SALES::setSales(Sales & s, const double ar[], int n) {
    double tmp;
    double tmp_ar[n];
    //making temporary copy of an array
    for(int i = 0; i < QUARTERS; i++) {
        tmp_ar[i] = ar[i];
    }
    //bubble sort
    for(int i = 0; i < n; i++){
        for(int j = i + 1; j < n; j++){
            if(tmp_ar[i] > tmp_ar[j]){
                tmp = tmp_ar[i];
                tmp_ar[i] = tmp_ar[j];
                tmp_ar[j] = tmp;
            }
        }
    }
    //filling s.sales with 4 lesser elements
    for(int i = 0; i < QUARTERS; i++) {
        s.sales[i] = tmp_ar[i];
    }

    //finding and assigning minimum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++) {
        if(s.sales[i] < s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.min = tmp;

    tmp = s.sales[0];
    //finding and assigning maximum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++){
        if(s.sales[i] > s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.max = tmp;

    //calculating average
    double tmp_sum = 0;
    for(int i = 0; i < QUARTERS; i++) {
        tmp_sum += s.sales[i];
    }
    s.average = tmp_sum / 4;
}
void SALES::setSales(Sales & s) {
    using std::cin;
    using std::cout;
    using std::endl;
    cout << "Input sales for each quarter" << endl;
    double input;
    for(int i = 0; i < QUARTERS; i++) {
        cout << "Input sales for " << i + 1 << " quarter: ";

        while(!(cin >> input)) {
            cout << "Not an integer. Try again..." << endl;
        }
        s.sales[i] = input;
    }
    //temporary value for maximum and minimum
    double tmp;
    //finding and assigning minimum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++) {
        if(s.sales[i] < s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.min = tmp;

    tmp = s.sales[0];
    //finding and assigning maximum
    tmp = s.sales[0];
    for(int i = 1; i < QUARTERS; i++){
        if(s.sales[i] > s.sales[i - 1])
            tmp = s.sales[i];
    }
    s.max = tmp;

    //calculating average
    double tmp_sum = 0;
    for(int i = 0; i < QUARTERS; i++) {
        tmp_sum += s.sales[i];
    }
    s.average = tmp_sum / QUARTERS;
}
void SALES::showSales(const Sales & s) {
    using std::cin;
    using std::cout;
    using std::endl;
    for(int i = 0; i < QUARTERS; i++)
        cout << "Quarter " << i + 1 << ": " << s.sales[i] << endl;

    cout << "Minimum: " << s.min << endl;
    cout << "Maximum: " << s.max << endl;
    cout << "Average: " << s.average << endl;
}

После этого изменения программа работает нормально.

...