重新定义错误:使用相同类名的不同.h文件

时间:2016-11-29 04:07:57

标签: c++ class scope redefinition

我创建了2个头文件。 ListA.h和ListN.h

他们都自己使用自己独特的List类。当我编译我的程序时(即使他们无法知道另一个存在,它会说明以下错误)

enter image description here 我很确定它不应该是重新定义,但显然是。任何帮助表示赞赏。

ListA.h

#ifndef __LISTA_H_
#define __LISTA_H_
#include <iostream>

using namespace std;
class List{
        public:
              List(int = 0);
              List(const List&);
              ~List();
};   
#endif

ListN.h

#ifndef __LISTN_H_
#define __LISTN_H_
#include <iostream>

using namespace std;

class List{
        public:
              List(int = 10);
              List(const List&);
              ~List();
};    
#endif

ListA.cpp

#include "ListA.h"
using namespace std;

List::List(int mySize)
{
    //...
}

ListN.cpp

#include "ListN.h"
#include <iostream>
using namespace std;
List::List(int size)
{
    //...
}

主要

#include <iostream>
#include "ListN.h"
using namespace std;

int main()
{
    List myList;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

当尝试链接的链接器找到List的定义/符号时,它确实在两个不同的obj文件中找到,因此链接器提供者错误。在visual studio错误号:LNK2005

要解决此错误,请执行以下操作之一:

  1. 要修复此问题,请将/FORCE:MULTIPLE添加到链接器命令行选项
  2. 在两个不同的命名空间中添加类,这将避免此错误。
  3. <强> ListN.h

    #ifndef __LIST_H_
    #define __LIST_H_
    #include <iostream>
    
    using namespace std;
    
    namespace ListN
    {
      class List{
      public:
          List(int = 10);
          List(const List&);
      };
    }
    
    #endif
    

    <强> ListN.cpp

    #include "ListN.h"
    #include <iostream>
    
    using namespace std;
    
    namespace ListN
    {
      List::List(int size)
      {
          //...
      }
    }
    

    <强> Main.cpp的

    #include <iostream>
    #include "ListN.h"
    int main()
    {
      ListN::List myList;
      return 0;
    }
    

答案 1 :(得分:0)

两个cpp文件都由编译器编译。因此,当链接器将文件链接在一起时,它会变得混乱,因为有多个List类。

要解决此问题,您可以使用命名空间,或者不要至少公开其中一个List类。

或者,如果想要将 ListN.h ListA.h 包含在内以进行配置,则这是错误的方法。您应该为标头添加#define参数,或者您应该找到其他方式,例如通过#ifdef。例如(我不确定这会编译,但你明白了):

<强> List.h

#ifndef __LIST_H_
#define __LIST_H_

#ifndef LIST_PARAM
#define LIST_PARAM 0
#endif

#include <iostream>

using namespace std;

class List{
        public:
              List(int = LIST_PARAM);
              List(const List&);
              ~List();
};    
#endif

<强>的main.cpp

#include <iostream>

#define LIST_PARAM 10
#include "List.h"

using namespace std;

int main()
{
    List myList;
    return 0;
}

我个人不喜欢这种方法;将值传递给构造函数会好得多:

int main()
{
    List myList{ 10 };
    return 0;
}