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 toSALES::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, botów: 0