c++ - 为什么在C++中收到重新定义错误?

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

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

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 中的代码段
#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(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()) {}
    ...
}

关于c++ - 为什么在C++中收到重新定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161442/

相关文章:

c++ - 来自 boost::async() 的 boost::future<> 类型

c++ - PIMPL,POD,实现类的可见性,它的析构函数会被调用吗?

c++ - QTimer 随着每次启动/停止而变得更快

C++ 从 get 函数中访问和操作二维指针数组

c++ - 在不创建新拷贝的情况下初始化成员变量

C++链表程序读取字符串

c# - 将类类型作为参数 c# 传递并与字典一起使用

c++ - 函数成员声明中各部分的名称

c++ - 为什么默认参数后允许使用参数包?

c++ - 不清楚的复制赋值运算符示例