C++ compile error: redefinition of 'class::class'
C++ compile error: redefinition of 'class::class'
我已经在代码的注释行中为编译器突出显示的行添加了错误。
header 文件:
#ifndef ADDRESS_H_EXISTS
#define ADDRESS_H_EXISTS
#include <iostream>
#include <string>
using namespace std;
class Address{
private:
string address1;
string address2;
string city;
string state;
string zipCode;
public:
Address(){} //note: 'Address::Address()' previously defined here|
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
){}
注意:#endif 存在于 header 文件的末尾
源文件:
#include <iostream>
#include <string>
#include "address.h"
using namespace std;
Address::Address(){} // error: redefinition of 'Address::Address()'
Address::Address( // error: redefinition of 'Address::Address(const string&,
// const string&, const string&, const string&, const string&)'|
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
):
address1(address1),
address2(address2),
city(city),
state(state),
zipCode(zipCode)
{
Address::address1 = address1_c;
Address::address2 = address2_c;
Address::city = city_c;
Address::state = state_c;
Address::zipCode = zip_c;
}
关于此错误的所有最常见问题的结论是 header 守卫是必需的,尽管此代码中已包含守卫。
我以为我误解了如何在 header 和源文件之间正确分隔初始化列表,但是当我评论说它仍然产生相同的错误时。
您遇到重新定义错误(我认为是链接器错误,而不是编译错误),因为 Address::Address()
和 Address::Address(const string&, const string&, const string&, const string&, const string&)
已经在头文件中定义,您在CPP 文件
为避免这种情况,您需要通过头文件中的声明替换函数定义,方法是将头文件中的 {}
替换为 ;
,这样:
public:
Address(); //By replacing '{}' by ';', you change that function definition into a function DECLARATION
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
); // Same for here
除内联函数和模板函数外,函数声明在头文件中,定义在 CPP 文件中
您通常应该做的是在 header 文件中定义函数原型,并在源文件中定义函数。但是,在您的 header 文件中,您似乎已经使用空 {}
括号指定了函数的定义。因此,编译器抱怨您在源文件中重新定义了函数定义。如果您删除 header 文件中的那两个 {}
空块并将它们替换为分号 ;
,应该可以解决此错误。
基本上,它在您的 header 中应该是这样的:
Address();
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
);
我已经在代码的注释行中为编译器突出显示的行添加了错误。
header 文件:
#ifndef ADDRESS_H_EXISTS
#define ADDRESS_H_EXISTS
#include <iostream>
#include <string>
using namespace std;
class Address{
private:
string address1;
string address2;
string city;
string state;
string zipCode;
public:
Address(){} //note: 'Address::Address()' previously defined here|
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
){}
注意:#endif 存在于 header 文件的末尾
源文件:
#include <iostream>
#include <string>
#include "address.h"
using namespace std;
Address::Address(){} // error: redefinition of 'Address::Address()'
Address::Address( // error: redefinition of 'Address::Address(const string&,
// const string&, const string&, const string&, const string&)'|
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
):
address1(address1),
address2(address2),
city(city),
state(state),
zipCode(zipCode)
{
Address::address1 = address1_c;
Address::address2 = address2_c;
Address::city = city_c;
Address::state = state_c;
Address::zipCode = zip_c;
}
关于此错误的所有最常见问题的结论是 header 守卫是必需的,尽管此代码中已包含守卫。 我以为我误解了如何在 header 和源文件之间正确分隔初始化列表,但是当我评论说它仍然产生相同的错误时。
您遇到重新定义错误(我认为是链接器错误,而不是编译错误),因为 Address::Address()
和 Address::Address(const string&, const string&, const string&, const string&, const string&)
已经在头文件中定义,您在CPP 文件
为避免这种情况,您需要通过头文件中的声明替换函数定义,方法是将头文件中的 {}
替换为 ;
,这样:
public:
Address(); //By replacing '{}' by ';', you change that function definition into a function DECLARATION
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
); // Same for here
除内联函数和模板函数外,函数声明在头文件中,定义在 CPP 文件中
您通常应该做的是在 header 文件中定义函数原型,并在源文件中定义函数。但是,在您的 header 文件中,您似乎已经使用空 {}
括号指定了函数的定义。因此,编译器抱怨您在源文件中重新定义了函数定义。如果您删除 header 文件中的那两个 {}
空块并将它们替换为分号 ;
,应该可以解决此错误。
基本上,它在您的 header 中应该是这样的:
Address();
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
);