为什么我在 C++ 中出现重定义错误?
Why am I getting a re-definition error in C++?
我写了一个 Fraction
class 来处理 Fraction
对象和重载等,我需要将实现与方法的定义分开,但我得到了class 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
紧随其后的是一些我认为只是一两个主要错误的级联效应。但如果真的需要,我可以 post 他们。
我认为这与我在 .cpp
文件中声明构造函数的方式有关,因为我知道有些东西不会继承,例如访问修饰符和 static
等。
抱歉,如果这是一个愚蠢的错误,我是 C++ 的新手,我无法在任何地方找到答案。
您已声明 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())
{}
简而言之,您需要删除其中一个。
您发布的代码中有一些错误。
首先,复制构造函数在头文件中被声明两次。这两个声明是相同的,因为它们的参数属于同一类型。
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()) {}
...
}
我写了一个 Fraction
class 来处理 Fraction
对象和重载等,我需要将实现与方法的定义分开,但我得到了class 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
紧随其后的是一些我认为只是一两个主要错误的级联效应。但如果真的需要,我可以 post 他们。
我认为这与我在 .cpp
文件中声明构造函数的方式有关,因为我知道有些东西不会继承,例如访问修饰符和 static
等。
抱歉,如果这是一个愚蠢的错误,我是 C++ 的新手,我无法在任何地方找到答案。
您已声明 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())
{}
简而言之,您需要删除其中一个。
您发布的代码中有一些错误。
首先,复制构造函数在头文件中被声明两次。这两个声明是相同的,因为它们的参数属于同一类型。
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()) {}
...
}