Problem z kompilacją wielu plików

0

Witam wszystkich, wiem że podobnych wątków było wiele, ale przeszukałem sporo i nie mogę znaleźć rozwiązania problemu kompilacji wielu plików.
Przy próbie komplilacji programu składającego się z pliku main, sales.cpp,sales.h dostaję taki komunikat błędu. Wszystkie pliki należa do tego samego projektu w tym samym folderze, przy tworzeniu projektu wybieram console aplication. Korzystam z DevC++

C:\Users\Dell\Desktop\Cpp\Project4\main.o main.cpp:(.text+0x84): undefined reference to SALES::SetSales(SALES::Sales&, double const*, int)' C:\Users\Dell\Desktop\Cpp\Project4\main.o main.cpp:(.text+0x90): undefined reference to SALES::ShowSales(SALES::Sales const&)'
C:\Users\Dell\Desktop\Cpp\Project4\collect2.exe [Error] ld returned 1 exit status
25 C:\Users\Dell\Desktop\Cpp\Project4\Makefile.win recipe for target 'Project1.exe' failed

Jak to naprawić? poniżej kody:
sales.h

#ifndef SALES_H_
#define SALES_H_

namespace SALES{
	const int quarters = 4;
	struct Sales {
		double sales[quarters];
		double average;
		double min;
		double max;
};

void SetSales(Sales &s, const double ar[],int n);
void SetSales(Sales &s);
void ShowSales(const Sales &s);
}
#endif

sales.cpp

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

using namespace std;
using namespace SALES;

void SetSales(Sales &s, const double ar[],int n)
{
	double total=0;
	double min=ar[0];
	double max =ar[0];
	for(int i=0; i<n;i++)
	{
		total+=ar[i];
		if(ar[i]<min)
		min=ar[i];
		else
		continue;
	}
	for(int i=0; i<n;i++)
	{
		if(ar[i]>max)
		max=ar[i];
		else
		continue;
	}
	s.average=total/n;
	s.max=max;
	s.min=min;
	s.sales[0]=min;
	for(int i=1; i<quarters;i++)
	{
		s.sales[i]=0;
	}
			
}

void ShowSales(const Sales &s){
	
	cout<<"\nWartosc min = "<<s.min;
	cout<<"nWartosc max = "<<s.max;
	cout<<"\nWartosci srednia = "<<s.average;
	cout<<"\nWartosci tablicy = ";
	for(int i=0;i<quarters;i++)
	{
		cout<<s.sales[i]<<", ";
	}
}

main.cpp

#include <iostream>
#include "sales.h"
const int Size=7;

int main() {
	using namespace std;
	using SALES::SetSales;
	using SALES::ShowSales;
	using SALES::Sales;
	double tablica[Size]={1,2,3,4,5,6,7};
	Sales tomek;
	SetSales(tomek,tablica,Size);
	ShowSales(tomek);
	return 0;
}
```cpp.
1
void ShowSales(const Sales &s){

    cout<<"\nWartosc min = "<<s.min;
    cout<<"nWartosc max = "<<s.max;
    cout<<"\nWartosci srednia = "<<s.average;
    cout<<"\nWartosci tablicy = ";
    for(int i=0;i<quarters;i++)
    {
        cout<<s.sales[i]<<", ";
    }
}

To definicja wolnej funkcji, a nie funkcji klasy. Powinno być:

void SALES::ShowSales(const Sales &s){

    cout<<"\nWartosc min = "<<s.min;
    cout<<"nWartosc max = "<<s.max;
    cout<<"\nWartosci srednia = "<<s.average;
    cout<<"\nWartosci tablicy = ";
    for(int i=0;i<quarters;i++)
    {
        cout<<s.sales[i]<<", ";
    }
}

Btw: na Pieruna, użyj czegoś lepszego niż Dev-C++.

0

No i działa... wielkie dzięki, przeoczyłem to:/
Jesli nie DevC++ to co innego polecasz dla początkującego?

0

Strasznie brzydki ten niby-C++

Dlaczego to są funkcje, a nie metody w klasie?
Dlaczego tablice w stylu C?
stałej quarters też by lepiej było w klasie
ShowSales bym widział ze strumieniem jako parametr (a nie sztywne cout)

0

Dopiero się uczę, do klas jeszcze nie doszedłem!
Co to znaczy że tablice w stylu C? a jak tablica wygląda w stylu C++?

0

Dzięki za info,
A podpowiedziałbyś jeszcze co chodzi z "ShowSales bym widział ze strumieniem jako parametr (a nie sztywne cout)"?

2

Pokazuję dwie rzeczy, co chciałem odnośnie strumienia, i skonwertowałem na obiektowy styl

Tu masz header

#ifndef SALES_H_
#define SALES_H_

namespace SALES{
    class Sales {
       const int quarters = 4;
        double sales[quarters];
        double average;
        double min;
        double max;

       void SetSales( const double ar[],int n);
       void SetSales();
       void ShowSales(std::iostream str) const;
};

}
#endif

a tu implementację

void Sales::ShowSales(std::iostream str) const {

    str<<"\nWartosc min = " << min;
    str<<"nWartosc max = " << max;
    str<<"\nWartosci srednia = " << average;
    str<<"\nWartosci tablicy = ";
    for(int i=0;i<quarters;i++)
    {
        str << sales[i] << ", ";
    }
}

EDIT
Zamiast/oprócz ShowSales można zdefiniować swój operator << do wypisania całego obiektu klasy Sales na stream.

0

Dzięki!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1