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
       );