【问题标题】:Redefinition of class function error C++重新定义类函数错误C++
【发布时间】:2014-02-23 23:12:51
【问题描述】:

我有我的基类 Gate,而派生类是 AND(XOR 等)。我在基类中拥有的虚函数用于确定输出,但是当我在 AND.h 中对其进行原型制作并尝试使用 AND.cpp 实现它时,我在编译时出现重新定义错误。我确信我已经正确地包含了所有内容。

门头

#ifndef GATE_H
#define GATE_H

class Gate{
    public:
        // various functions etc.

        virtual bool output();   // **PROBLEM FUNCTION**

};

#endif

门源

#include "Gate.h"

//*various function declarations but not virtual declaration*

派生类“AND”

#ifndef AND_H_INCLUDED
#define AND_H_INCLUDED

class AND: public Gate{
public:
    bool output(bool A, bool B){}
};
#endif // AND_H_INCLUDED

以及我的 IDE 将我的错误放在 AND.h 文件中的位置

#include "AND.h"

bool AND::output(bool A, bool B){
    if (A && B == true){
        Out = true;
    } else {
        Out = false;
    }

    return Out;
}

在这种情况下,Out 是一个继承变量。

【问题讨论】:

  • 您的 AND 标头应包含编译所需的标头。
  • 就我而言,你不能声明一个没有参数的函数,然后用参数重新定义它。
  • @Mauren,在这种情况下,它会被遮蔽。
  • 老实说,我会让output 函数只是return Out = A && B;
  • @chris true,感谢您的指出。然而,它似乎并不是 OP 想要的。

标签: c++ function class virtual


【解决方案1】:

您在 AND 类定义中定义方法 AND::output

bool output(bool A, bool B){} // this is a definition

你在这里重新定义它:

bool AND::output(bool A, bool B){

  if (A && B == true){
  ....

您可以通过将前者更改为声明来解决此问题:

bool output(bool A, bool B);

【讨论】:

    【解决方案2】:

    您提供了AND::output 的两个定义。一个在标头中,为空,另一个在实现文件中,不为空。看起来你的标题应该有:

    bool output(bool A, bool B);
    

    请注意,您将无法多态地使用这些 output 函数,因为它们的参数与 Gate 中的声明不同。

    【讨论】:

    • 我的标题确实包含您在其 public: 条款中指定的内容。我认为虚函数被传递给派生类,然后能够定义它们?
    • @user3344556,仅当签名匹配时(嗯,大致是因为返回类型也需要)。
    • @user3344556 不,它没有。再检查一遍。以及克里斯所说的。
    • 谢谢,我现在明白了。 AND.h 仍然有一个错误,尽管“'{' token 之前的预期类名
    【解决方案3】:

    正如已经说过的,您定义了两次函数输出:在标头中和在 cpp 模块中。另外这个函数不是虚函数,因为它的参数数量和类型与基类中同名虚函数的声明不一致。

    我想补充一点,这个函数可以定义得更简单

    bool AND::output(bool A, bool B)
    {
       return ( Out = A && B );
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-27
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多