Question

I'm new to c++ and was just trying to do a question that involves 3 files.

I got a header file with a namespace that declares a structure and some prototypes. In definitions.cpp file, I have all the function definitions. Then the main.cpp file, just creates a few structures, calls some functions to fill the structures, then calls another function to display the structures.

The problem I have is it gives me an unresolved external error. From what I can gather I think the compiler is complaining that it cant find the prototypes for the functions being called in main.cpp - the overloaded setStruct() and the showStruct().

But I thought when I included the header.h file and declared the functions with the using declaration, in main.cpp, it gave the compiler access to the prototypes stored in the header file?

Header.h

#ifndef header_h
#define header_h

namespace SALES
{
    const int QUARTERS = 4;

    struct Sales
    {
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };
    void setSales(Sales & s, const double ar[], int n);
    void setSales(Sales & s);
    void showSales(const Sales & s);
}

#endif

Definitions.cpp

#include<iostream>
#include"header.h"
using SALES::Sales;
using SALES::QUARTERS;


double max(Sales & s) //find max sale value in sales array
{
    double maxVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]>maxVal)
        {
            maxVal = s.sales[i];  
        }

    }
    return maxVal;
}

double min(Sales & s) //find min sale value in sales array
{
    double minVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]<minVal)
        {
            minVal = s.sales[i];  
        }

    }
    return minVal;
}

void setSales(Sales & s) // fill sales structure interactivly
{
    std::cout<< "Please enter the sales for the yearly quarters.\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<< "Quater "<<i+1<<": ";
        while(!(std::cin>>s.sales[i]))
        {
            std::cout<<"Please enter valid input\n";
            std::cout<< "Quater "<<i+1<<": ";
            std::cin.clear();
            std::cin.ignore();
        }

    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);

}


void setSales(Sales & s, const double ar[], int n) // fill sales structure non interactivly
{
    for(int i = 0;i<n;i++)
    {
        s.sales[i] = ar[i];
    }
    for(int i = n;i<QUARTERS;i++)
    {
        s.sales[i] = 0;
    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);


}

void showSales(const Sales & s) // display structure
{
    std::cout<< "\nSales for the year\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<<"Quarter "<<i+1<<": $"<<s.sales[i];
    }
    std::cout<<"Max Sale: "<<s.max<<std::endl;
    std::cout<<"Min Sale: "<<s.min<<std::endl;
    std::cout<<"Average of sales: "<<s.average<<std::endl;
}

Main.cpp

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

using SALES::Sales;
using SALES::setSales;
using SALES::showSales;

int main()
{
    double Sales1[4] = {453.50, 654.60, 340.20, 500.30};

    Sales Year1;
    Sales Year2;

    setSales(Year1, Sales1, 3);
    setSales(Year2);

    showSales(Year1);
    showSales(Year2);

    return 0;
}

Error

1>------ Build started: Project: Myfirst, Configuration: Debug Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &,double const * const,int)" (?setSales@SALES@@YAXAAUSales@1@QBNH@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &)" (?setSales@SALES@@YAXAAUSales@1@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::showSales(struct SALES::Sales const &)" (?showSales@SALES@@YAXABUSales@1@@Z) referenced in function _main
1>E:\Documents\Uni\Programming\C++ starter projects\Myfirst\Debug\Myfirst.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Any help would be great, thanks.

Was it helpful?

Solution

When you define the setSales etc functions, you need to tell the compiler that they are in the SALES namespace. Putting

namespace SALES
{

    // functions here
}

will do it.

OTHER TIPS

You are currently defining your functions outside of any namespace, and that is the reason for the linker not finding the definitions within the namespace where those functions are declared and recognized.

The fix would be to wrap the functions in your implementation file - Definitions.cpp -, with the namespace similarly how you are doing it in the header file.

This is what I would write if I were you:

namespace SALES
{
    ...
    void setSales(Sales & s) // fill sales structure interactivly
    ...
        std::cout<<"Average of sales: "<<s.average<<std::endl;
    }
}

If you do not put the rest (your min and max) into the namespace, use the :: scope specifier just in case, although I would suggest to put everything into your own namespace.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top