【问题标题】:Class with pass-by-reference object gives compile error具有传递引用对象的类给出编译错误
【发布时间】:2011-01-20 12:33:24
【问题描述】:

我在一个单独的头文件中定义了一个 A 类。我希望 B 类具有对存储为变量的 A 类对象的引用。

像这样:

文件:A.h

class A {
    //Header for class A...
};

文件:B.h

#include "A.h"
class B {
    private:
(24)        A &variableName;
    public:
(36)        B(A &varName);
};

当我尝试使用 g++ 编译它时,出现以下错误:

B.h:24: error: ‘A’ does not name a type
B.h:36: error: expected `)' before ‘&’ token

关于我做错了什么有什么建议吗?如果重要的话,A 类是一个抽象类。

编辑:代码中的一些错别字

【问题讨论】:

  • 我认为你打错了类名。 B 类有一个 B& 成员和一个构造函数 A()。
  • 类定义后缺少分号。 class A { ... }; //<-- here.
  • 当我在 SO! :)
  • A.h 中是否包括 B.h?
  • 这可能是一个错字、定义或类似问题。如果您将其输入到 stackoverflow 中并输入更多错别字,这将无济于事。尝试将代码减少到失败的最小表达式,然后复制并粘贴到问题中。

标签: c++ oop class object pass-by-reference


【解决方案1】:

对我来说,它编译得很好(如预期的那样)。我猜A.h 没有被正确包含。是否有另一个同名的文件被包含在内?也许有#ifdefs 或一些这样的东西会阻止编译器看到A 的定义。为了检查这一点,我会将某种语法错误放入A.h,然后查看编译器是否捕获它。

【讨论】:

  • 就是这样!我有一些不正确的#ifndef-s。非常感谢!
  • @Paul:这就是为什么在提问时最好从编辑器中复制粘贴代码。
【解决方案2】:

就我所见,这段代码是正确的。请检查以下内容:

  • A 在某个命名空间中吗?
  • A 是嵌套类吗?
  • A 是代码中某个宏的名称吗?
  • A 的名字真的是 A,还是您的真实代码中有一些拼写错误?

如果这些都不起作用,那么除非您发布发生错误的真实代码,否则我无法帮助您。

【讨论】:

  • 是的,我改名时打错了。现在是正确的
  • 编辑:添加了潜在原因列表。
【解决方案3】:

A.h 是否包括 B.h(直接或间接)?如果是这样,那么由于递归包含,您将无法在 B 之前定义 A。如果需要在 A 中定义 B,请使用 forward declaration

【讨论】:

    【解决方案4】:

    请注意,将引用作为成员变量很少是一个好主意。 B 这个名字到底代表什么?

    【讨论】:

    • 为什么这是个坏主意?将引用作为成员变量并没有错。
    • B 是一个记录器。计划是它将从 A(驱动连接到 USB 的电机)获取值用于存储和处理。
    【解决方案5】:

    您似乎试图在完全不相关的类 B 中为类 A 声明一个构造函数,这正是编译器所抱怨的。

    如果您想要从编译器的角度将B 转换为A 的默认/隐式方式,您将需要类似

    operator A(B const &var);
    

    而不是构造函数声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2013-06-23
      • 2020-05-09
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多