1
votes

I just got into C++ and I was trying to write a simple code for a simulation, but I bumped into a multiple definition problem than I cannot solve.

So, I'm creating a class and this is the header file:

Piano.h

    #ifndef PIANO_H
    #define PIANO_H

    #include"vettore.h"
    #include"PuntoMat.h"
    #include<string>
    #include<vector>

    class Piano
    {
     public:

     //Costruttori
     Piano(std::string material, float lenght, float inclin = 0)
          :  m_material(material),  m_lenght(lenght),  m_inclin(inclin), m_time(0) {;}

     //Metodo per l'aggiunta di corpi al piano
     void Add(PuntoMat p) { m_corpi.push_back(&p); }
     //Metodo che stampa le coordinate dei corpi nel sistema
     void Print();

     private:

     std::string m_material;
     std::vector<PuntoMat*> m_corpi;
     float m_lenght;
     float m_inclin;
     float m_time;

    };

    #endif

this is the corresponding file .cxx, where I define the function "Print"

Piano.cxx

    #include"vettore.h"
    #include"PuntoMat.h"
    #include"Piano.h"
    #include<iostream>
    #include<stdlib.h>
    #include<vector>

    void Piano::Print()
    { std::cout << "Tempo: " << m_time << " s" << std::endl;

      if(m_corpi.size() == 0)
      { std::cout << "Nessun corpo sul piano" << std::endl;
      exit(1);
      }

      for(int i=0; i<m_corpi.size(); i++)
      { std::cout << *m_corpi[i] << std::endl;
       }
      std::cout << std::endl;

    }

This is the code I'm using to validate the class

main.cxx

    #include<iostream>
    #include"vettore.h"
    #include"PuntoMat.h"
    #include"Piano.cxx"
    #include<string>

    main()
    {
      PuntoMat a(3, Vettore( 0, 0), Vettore( 5.4, 0), "Legno");
      PuntoMat b(5, Vettore( 8.3, 6.5), Vettore( 0, 0), "Vetro");

      Piano p( "Ferro", 50);
      p.Add(a);
      p.Add(b);
      p.Print();

      return 0;
     }

When I compile I get a multiple definition error about the function Print, this one:

   /tmp/ccp1giKM.o: In function `Piano::Stampa()':
   main.cxx:(.text+0x0): multiple definition of `Piano::Stampa()'
   /tmp/cctCJRQF.o:Piano.cxx:(.text+0x0): first defined here
   collect2: error: ld returned 1 exit status

I really don't know how to solve this problem, since it seems to me that the function Print() has been defined only in the file Piano.cxx. Can anyone help me with this?

P.s. Ignore the general meaning of the code and the comments (they are in italian). All the other classes included have been already validate and there is no problem with them.

1
You do not have Piano::Stampa anywhere in your code. Please check if you posted the right code. - DYZ
Your error message clearly isn't coming from the code you posted. If you try to compile and run the code you actually posted, what happens? - user2357112 supports Monica
You shouldn't include a .cxx file. You compile that to a .o file, and link it with main.o. - Barmar
yes sorry the error is not the right one: - Jacopo Piantanida
Anyhow the right error looks just the same, just substitute Piano::Stampa with Piano::Print - Jacopo Piantanida

1 Answers

0
votes

Your problem is that you try to include the cxx file. You should only include .h/.hpp files. Instead of include the source files you should tell your compiler to use it.

So in your case removing the "#include"Piano.cxx" line and than calling your compiler in this way(asuming g++),

g++ main.cxx Piano.cxx

should fix the problem. If you want to create bigger projects you should have a look at creating object files from your sources.