我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类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来说,它工作得很好(在运算符中)
由于a.h
和b.h
包含在spn.h
中,而spn.h
包含在a.h
和b.h
中,因此存在循环依赖关系。我要做的是从spn.h
中删除a
和b.h
包含的a
和b
。但是,您可能需要在spn.h
中转发声明a
和b
(因为它实际上不包含该文件,所以它会出现与您现在看到的错误相同的错误):
#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.cp
、spn.cc
等)文件中包含a.h
和b.h
来进行编译。希望这能解决问题!
而且,就像一些评论者所说的,a*&
有点古怪--但这可能要留给另一个问题来解决。