Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类定义中函数的多重定义 我刚进入C++,我试图编写一个简单的仿真代码,但是我碰到了一个比我不能解决的多定义问题。p>_C++_Multiple Definition Error - Fatal编程技术网

C++;类定义中函数的多重定义 我刚进入C++,我试图编写一个简单的仿真代码,但是我碰到了一个比我不能解决的多定义问题。p>

C++;类定义中函数的多重定义 我刚进入C++,我试图编写一个简单的仿真代码,但是我碰到了一个比我不能解决的多定义问题。p>,c++,multiple-definition-error,C++,Multiple Definition Error,我正在创建一个类,这是头文件: 钢琴 #ifndef PIANO_H #define PIANO_H #include"vettore.h" #include"PuntoMat.h" #include<string> #include<vector> class Piano { public: //Costruttori Piano(std::string material

我正在创建一个类,这是头文件:

钢琴

    #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
我真的不知道如何解决这个问题,因为在我看来,函数Print()只在Piano.cxx文件中定义。有人能帮我吗


注意:忽略准则和注释的一般含义(它们是意大利语)。包含的所有其他类都已经过验证,它们没有问题。

您的问题是试图包含cxx文件。您应该只包括.h/.hpp文件。您应该告诉编译器使用源文件,而不是包含源文件

因此,在您的例子中,删除“#include”Piano.cxx”行,然后以这种方式调用编译器(asuming g++)

g++main.cxx Piano.cxx


应该解决这个问题。如果您想创建更大的项目,您应该看看如何从源代码中创建对象文件。

您的问题是您试图包含cxx文件。您应该只包含.h/.hpp文件。而不是包含源代码文件,您应该告诉编译器使用它

因此,在您的例子中,删除“#include”Piano.cxx”行,然后以这种方式调用编译器(asuming g++)

g++main.cxx Piano.cxx


应该可以解决这个问题。如果你想创建更大的项目,你应该看看从你的源创建对象文件

您的代码中没有
Piano::Stampa
。请检查您发布的代码是否正确。您的错误消息显然不是来自您发布的代码。如果您试图编译并运行实际发布的代码,会发生什么?您不应该包含
.cxx
文件。您将其编译成一个
.o
文件,并将其与
main.o
链接。是的,很抱歉错误不正确:无论如何正确的错误看起来都一样,只需将Piano::Stampa替换为Piano::Print即可。您的代码中没有
Piano::Stampa
。请检查您发布的代码是否正确。您的错误消息显然不是来自您发布的代码。如果您试图编译并运行实际发布的代码,会发生什么?您不应该包含
.cxx
文件。您将其编译为一个
.o
文件,并将其链接到
main.o
。是的,很抱歉,错误不正确:无论如何,正确的错误看起来都一样,只需用Piano::Print替换Piano::Stampa即可
    #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;

    }
    #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;
     }
   /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