Я изучаю 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;
}
После этого изменения программа работает нормально.