【问题标题】:Trouble instantiating class with reference to another class引用另一个类来实例化类时遇到问题
【发布时间】:2012-03-30 17:50:02
【问题描述】:

我正在尝试实例化一些类,并传递对第一个类的引用。

编译器给我一个错误说明:错误:'classData'不是类型。

ClassData 包含一些复杂的数据结构,并且有一堆访问该数据的方法。 ClassFunc 有一堆对这些数据进行操作的函数。然后Work类做了一堆工作,偶尔需要调用ClassB中的一个函数,对ClassData中的数据做一些工作。

下面是代码:

/////////////////////////
//ClassData.h
class ClassData {
public:
    ClassData(){
        // initialize a bunch of stuff
    };
    virtual ~ClassData(){};
}

/////////////////////////
//ClassFunc.h
#include "ClassData.h"

class ClassFunc {
public:
    ClassFunc(ClassData& in_classData) : classData(in_classData){};
    virtual ~ClassFunc();

    float updateEta(float deltaVJ, int column);

private:
    ClassData& classData;

};

/////////////////////////
//ClassFunc.cpp
#include "ClassFunc.h"

float ClassFunc::updateEta(float a, int b){
    float foo = 0.0
    // Do a bunch of work to foo
    return foo;

};

/////////////////////////
// Work.h
#include "ClassData.h"
#include "ClassFunc.h"

class Work{

public:
    Work(ClassData& in_class) :  classData(in_class){
        // initialize some stuff
    };
    ~Work(){};

    float updateTheta(int a, float b, float c);

private:
    ClassData& classData;
    ClassFunc classFunc(classData);  //// ERROR IS HERE
}

/////////////////////////
//  Work.cpp
#include "Work.h"
float Work::updateTheta(int a, float b, float c){

    // do some work first
    double foo = classFunc.updateEta(d, e);
    return foo
};

【问题讨论】:

  • 您在类定义后缺少分号。这是你的实际代码吗?
  • ClassB(Class A& in_classA) --> "Class A" vs. "ClassA" 好像多了一个空格
  • 别等了,这不是重复的,抱歉。我希望我可以取消投票关闭。
  • 不是我的实际代码 - 在这里包含很长时间。我很可能在输入这个快速示例时打错了一两个字

标签: c++ instantiation


【解决方案1】:

您的编译器是对的:classA 不是类型。 C++ 区分大小写; ClassA 是您要查找的类型(检查 ClassB 的构造函数的第一行)。

希望有帮助!

【讨论】:

    【解决方案2】:

    问题修改后回答

    ClassFunc classFunc(classData); 不是类定义中的有效语法。您需要通过 set 函数或构造函数来获得这个 classFunc 变量。

    但是,仅编写一个 setter 会很困难,因为您的 ClassFunc 需要 ClassData。为了解决这个问题,您可能还需要修改您的 ClassFunc

    另外,还有一个错误。 ClassDataWork 缺少 ;在其定义的末尾。

    问题修改前的原始答案

    这段代码有几个错误。比如

    float ClassA::funcA{

    应该是

    float ClassA::funcA(){

    另外,它看起来像一个函数定义。

    第二,有

    ClassB(Class A& in_classA): classA(in_classA){

    应该是这样的

    ClassB(ClassA& in_classA): classA(in_classA){

    因为Class A 不是类型。

    另外,您遗漏了几个分号,但这些分号应该很明显。

    【讨论】:

    • 正如我上面写的,这是一个快速输入的示例。可能有一些错别字。
    • 没关系,主要问题似乎是您对 funcA() 的定义。一旦解决了,剩下的就是错别字了。
    【解决方案3】:

    问题是不能在类声明中初始化成员变量:

    ClassFunc classFunc(classData);
    

    相反,在构造函数的初始化列表中对其进行初始化:

    Work(ClassData& in_class) :  classData(in_class), classFunc(classData) {}
    

    【讨论】:

    • 失败并出现错误:错误:从“ClassData”类型的表达式中对“ClassFunc&”类型的引用进行无效初始化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多