【问题标题】:Why am I getting a re-definition error in C++?为什么在 C++ 中出现重新定义错误?
【发布时间】:2020-11-19 12:09:22
【问题描述】:

我编写了一个Fraction 类来处理Fraction 对象和重载等工作,我需要将实现与方法的定义分开,但是在涉及到构造函数时出现重新定义错误类Fraction

Fraction.h

中的代码 sn-p
class Fraction
{
private:
   int calcGCD(int n1, int n2) const;
   int compare(const Fraction& fraction) const;
   int m_numerator;
   int m_denominator;
public:
   Fraction(int numerator = 0, int denominator = 1) : m_numerator(numerator), m_denominator(denominator);
   Fraction(const Fraction& fraction) : m_numerator(fraction.numerator()), m_denominator(fraction.denominator());
   Fraction(const Fraction& orig);
};

Fraction.cpp

中的代码 sn-p
#include "Fraction.h"

Fraction::Fraction(int numerator, int denominator) 
   : m_numerator(numerator), m_denominator(denominator)
{}

Fraction::Fraction(const Fraction& fraction)
   : m_numerator(fraction.numerator()), m_denominator(fraction.denominator())
{}

这会导致以下错误:

Fraction.h:26:5: error: 'Fraction::Fraction(const Fraction&)' cannot be overloaded with 'Fraction::Fraction(const Fraction&)'
Fraction.h:25:5: note: previous declaration 'Fraction::Fraction(const Fraction&)'
Fraction.h:24:105: error: expected '{' at end of input

其次是其他一些我认为只是一两个主要错误的级联效应。但如果真的需要,我可以发布它们。

我认为这与我在 .cpp 文件中声明构造函数的方式有关,因为我知道有些东西不会继承,例如访问修饰符和 static 等。

对不起,如果这是一个愚蠢的错误,我是 C++ 新手,我无法在任何地方找到答案。

【问题讨论】:

  • 您已经在标题中实现了Fraction::Fraction(const Fraction &fraction)
  • 您有 2 个分数构造函数,它们采用相同的参数 const Fraction &
  • 您认为Fraction(const Fraction &fraction) : m_numerator(fraction.numerator()), m_denominator(fraction.denominator());Fraction(const Fraction& orig); 之间的区别到底是什么。

标签: c++ class c++11 constructor declaration


【解决方案1】:

您已经声明了两次copy constructor

Fraction(const Fraction& fraction) ....
Fraction(const Fraction& orig);

看签名。它们是相同的,这在 C++ 中是不可能的。

您可能指的是 Fraction.h

Fraction(const Fraction &fraction); // only one

Fraction.cpp

Fraction::Fraction(const Fraction& fraction)
   : m_numerator(fraction.numerator())
   , m_denominator(fraction.denominator())
{}

简而言之,您需要删除其中一个。

【讨论】:

    【解决方案2】:

    您发布的代码中有一些错误。

    首先,复制构造函数在头文件中声明两次。这两个声明是相同的,因为它们的参数是相同的类型。

    Fraction(const Fraction& fraction);
    Fraction(const Fraction& orig);
    

    其次,构造函数被定义两次:一次在头文件中,一次在源文件中。只能有一个定义。您可以选择保留哪一个。我通常更喜欢在源文件 (.cpp) 中定义它们以隐藏实现细节。

    最后,如果将定义保留在头文件中,则缺少一对括号。头文件中的有效实现如下所示:

    class Fraction {      
    private:
        ...
        int m_numerator;
        int m_denominator;
    public:
        Fraction(int numerator = 0, int denominator = 1) : m_numerator(numerator), m_denominator(denominator) {}
        Fraction(const Fraction &fraction) : m_numerator(fraction.numerator()), m_denominator(fraction.denominator()) {}
        ...
    }
    

    【讨论】:

    • 好的,我删除了一个复制构造函数。我没有意识到netbeans把它放在那里。但是,在头文件中实现的构造函数是什么意思?我没有为其中任何一个添加身体。
    • 看看这里的第一个例子:en.cppreference.com/w/cpp/language/constructor : m_numerator(numerator), m_denominator(denominator) 部分,称为成员初始化列表,是构造函数定义的一部分。它不是声明的一部分,因此不必在头文件和源文件中重复。
    • prnt.sc/tqu5yy 这就是我所要做的吗?因为我仍然收到有关括号的错误。抱歉,我检查了您发送的链接,但他们所有的示例在同一个文件中都有代码。当我的程序都在同一个文件中时,我的程序可以完美运行。
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 2022-01-22
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多