【问题标题】:C++ compile error: redefinition of 'class::class'C++ 编译错误:重新定义 'class::class'
【发布时间】:2017-07-24 15:59:39
【问题描述】:

我已在代码的注释行中为编译器突出显示的行添加了错误。

头文件:

#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 存在于头文件的末尾

源文件:

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

 }

关于此错误的所有最流行的问题都得出结论,需要标头保护,尽管此代码中已经包含了保护。 我以为我误解了如何正确分离头文件和源文件之间的初始化列表,但是当我评论它时它仍然产生相同的错误。

【问题讨论】:

  • Address(){} 定义了一个空的默认构造函数。声明(在单独的 .cpp 文件中实现)看起来像 Address();
  • 啊,这有帮助。谢谢。我想接受这个作为答案,但它没有显示复选标记。
  • 在一个切题上,有一个用于重新表示街道地址的类的默认构造函数是可疑的。可以说默认指针为空,默认数字为零,默认字符串为空。好的设计选择与否,这些都是可以理解的。但是默认地址是什么?
  • 另一件事是using namespace std。不要,尤其是在头文件中。

标签: c++ class header-files


【解决方案1】:

您通常应该做的是在头文件中定义函数原型,在源文件中定义函数。但是,在您的头文件中,您似乎已经使用空的{} 括号指定了函数的定义。因此编译器抱怨你在源文件中重新定义了函数定义。如果你把头文件中的那两个{}空块去掉,用分号;代替,应该可以解决这个错误。

基本上,它在您的标题中应该如下所示:

Address();

Address(
        const string &address1,
        const string &address2,
        const string &city,
        const string &state,
        const string &zipCode
       );

【讨论】:

    【解决方案2】:

    您收到重新定义错误(我认为这是链接器错误,而不是编译错误),因为 Address::Address()Address::Address(const string&amp;, const string&amp;, const string&amp;, const string&amp;, const string&amp;) 已在头文件中定义,您在 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 文件中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2020-09-01
      • 2012-10-13
      • 2013-03-20
      相关资源
      最近更新 更多