提问者:小点点

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


我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类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个答案

匿名用户

由于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*&有点古怪--但这可能要留给另一个问题来解决。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|在其|类|中|类|类型)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?