当前位置: 首页 > 知识库问答 >
问题:

C++:如何在其他类中使用类类型?

龚安民
2023-03-14

我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类SPN、A和B。我重载了2次operator=。我想将A类型或B类型作为参数传递。

void SPN::operator=(A*& R)
{
    (*R)(*this);
}
void SPN::operator=(B*& R)
{
    (*R)(*this);
}

它不会抛出任何错误。但是如果我在类B或A中尝试make operator(),则使用参数SPN,如下所示:

void A::operator()(SPN*& spn)
{
    //todo
}

它会抛出SPN未命名类型的错误。我甚至不能在A类或B类中创建类SPN对象。也许它不是如何客观编程工作,所以我想得到它,为什么我不能那样做。

有我的代号:A.H(B相同)

#pragma once
#include "SPN.h"

class A 
{
public:
    SPN temp;                   <<it throws error: 'SPN' has not been delcared
    void operator()(SPN*& spn); <<it throws error: 'SPN' has not been delcared
};

SPN.H

#pragma once
#include "A.h"
#include "B.h"
#include <random>
#include <iostream>

class SPN
{
public:
    friend class A;
    friend class B;
    A* a;
    B* b;
    void operator=(A*& R);
    void operator=(B*& R);
};

总结一下,我的问题是:为什么它会抛出错误,那个类型SPN没有命名一个类型(在a和B类中),但对于SPN来说,它工作得很好(在运算符中)

共有1个答案

郭志泽
2023-03-14

由于a.hb.h包含在spn.h中,而spn.h包含在a.hb.h中,因此存在循环依赖关系。我要做的是从spn.h中删除ab.h包含的ab。但是,您可能需要在spn.h中转发声明ab(因为它实际上不包含该文件,所以它会出现与您现在看到的错误相同的错误):

#pragma once
#include <random>
#include <iostream>

// forward declarations 
class A;
class B;

class SPN
{
public:
    friend class A;
    friend class B;
    A* a;
    B* b;
    void operator=(A*& R);
    void operator=(B*& R);
};

由于您只使用指针,这应该可以工作。您可能需要在源代码(spn.cpspn.cc等)文件中包含a.hb.h来进行编译。希望这能解决问题!

而且,就像一些评论者所说的,a*&有点古怪--但这可能要留给另一个问题来解决。

 类似资料:
  • 问题内容: 我认为在理解OOP的工作方式方面存在问题。我已经更改了它可以工作的代码,但这不是我认为的正确方法。以下情况(不,我不是自己创建用户登录,实际上只是为了让本地开发人员更好地理解OOP): 我有一个database.php文件: 因此,在此类中,我正在创建数据库连接,然后返回连接(对象?) 然后,我有第二个类,著名的User类(实际上,我没有使用自动加载功能,但是我知道): 那是我的两堂课

  • 我想我在理解OOP是如何工作的方面遇到了一个问题。我已经改变了它的工作代码,但它不是我认为的支持方式。下面的场景(不,我不是自己创建一个用户登录,它实际上只是为了让本地开发人员更好地理解OOP): 我有一个database.php文件: 因此,在这个类中,我创建了一个数据库连接,并返回该连接(对象?) 然后我有第二个类,著名的User类(其实我没有在使用autoload,但我知道它): 这是我的两

  • 我想我在理解OOP是如何工作的方面遇到了一个问题。我已经改变了它的工作代码,但它不是我认为的支持方式。下面的场景(不,我不是自己创建一个用户登录,它实际上只是为了让本地开发人员更好地理解OOP): 我有一个database.php文件: 因此,在这个类中,我创建了一个数据库连接,并返回该连接(对象?) 然后我有第二个类,著名的User类(其实我没有在使用autoload,但我知道它): 这是我的两

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Using Other Message Types 一节 可以使用其他消息类型作为字段类型. 例如, 假设你想在每个SearchResponse消息中包含Result消息 - 为了做到这点, 你可以在相同的.proto文件中定义Result消息类型然后具体指定SearchResponse中的一个字段为Result类型:

  • 问题内容: 我已经用C ++实现了一个类。我想将其与Python一起使用。 请提出逐步方法,并详细说明每个步骤。 这样的东西 现在,在Python中 请提出建议。我该怎么办?注意:我想知道手动的方法。我不希望任何第三方库依赖。 问题答案: 查看Boost.Python。这是一个用C ++编写python模块的库。 还要研究SWIG,它也可以处理其他脚本语言的模块。我过去曾使用它来为我的课程编写模块