C++类定义中函数的多重定义

Posted

技术标签:

【中文标题】C++类定义中函数的多重定义【英文标题】:C++ multiple definition of function in class definition 【发布时间】:2017-09-01 22:21:21 【问题描述】:

我刚接触 C++,并试图为模拟编写一个简单的代码,但我遇到了一个无法解决的多定义问题。

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

钢琴.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

这是对应的文件.cxx,我在这里定义了函数“打印”

钢琴.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;

    

这是我用来验证类的代码

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;
     

当我编译时,我得到一个关于打印函数的多重定义错误,这个:

   /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

我真的不知道如何解决这个问题,因为在我看来函数 Print() 仅在文件 Piano.cxx 中定义。谁能帮我解决这个问题?

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

【问题讨论】:

您的代码中没有Piano::Stampa。请检查您是否发布了正确的代码。 您的错误消息显然不是来自您发布的代码。如果您尝试编译并运行您实际发布的代码,会发生什么? 您不应包含.cxx 文件。您将其编译为 .o 文件,并将其与 main.o 链接。 是的,很抱歉错误不是正确的: 无论如何正确的错误看起来都一样,只需将 Piano::Stampa 替换为 Piano::Print 【参考方案1】:

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

因此,在您的情况下,删除“#include”Piano.cxx” 行,而不是以这种方式调用您的编译器(假设 g++),

g++ main.cxx Piano.cxx

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

【讨论】:

以上是关于C++类定义中函数的多重定义的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的多个类定义错误,我的头文件有问题吗?

c++解决二义性的方法

C++:包含父类时出现多重定义错误?

C ++多重继承,多重定义时没有?

C++ - “函数的多重定义”我们如何解决它?

C++笔记-类层次结构