首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++类定义中函数的多个定义

C++类定义中函数的多个定义
EN

Stack Overflow用户
提问于 2017-09-02 06:21:21
回答 1查看 1.5K关注 0票数 1

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

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

Piano.h

代码语言:javascript
复制
    #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,我在其中定义了函数"Print“

Piano.cxx

代码语言:javascript
复制
    #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

代码语言:javascript
复制
    #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;
     }

当我编译时,我得到一个关于函数Print的多重定义错误,如下所示:

代码语言:javascript
复制
   /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文件中定义过。有人能帮我吗?

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

EN

回答 1

Stack Overflow用户

发布于 2017-09-02 07:14:09

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

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

g++ main.cxx Piano.cxx

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46008633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档