gpt4 book ai didi

c++ - 前向声明类,类重定义

转载 作者:行者123 更新时间:2023-11-28 02:05:58 25 4
gpt4 key购买 nike

所以我有 2 个类,我们称它为 A 类和 B 类,它们在这些类内部有一个相互引用作为函数的参数。当我尝试像这样转发声明时:

// A.h (Header guarded)
namespace ns {
class B { // Attempt to forward declare B
public:
int getRand();
};

class A {
public:
float a, b;

void aFunc(B &b);
};
}

// B.h (Header guarded)
namespace ns {
class A { // Attempt to forward declare A
public:
float a, b;
};

class B {
public:
void bFunc(A &a);
int getRand();
};
}

事情是,当我这样做时,我得到了 'class' type redefinition 错误。我一直在寻找解决方案,但仍未找到解决方案。我这样做对吗?我想我不是,你能告诉我我哪里做错了吗?

最佳答案

它们不是前向声明,它们绝对是定义。

你应该

// A.h (Header guarded)
namespace ns {
class B; // forward declare B

class A {
public:
// Some functions with B references as arguments
};
}

B.h 也是如此。

根据您的情况,只有一些成员函数将声明的类作为参数,您可以将成员函数的声明保留在.h 文件中,并在.cpp 文件中提供它们的定义。比如

// A.h (Header guarded)
namespace ns {
class B; // forward declare B
class A {
public:
float a, b;
void aFunc(B &b);
};
}

// B.h (Header guarded)
namespace ns {
class A; // forward declare A
class B {
public:
void bFunc(A &a);
int getRand();
};
}

// A.cpp
#include "A.h"
#include "B.h"
namespace ns {
void A::aFunc(B& b) { /* ... */ }
}

// B.cpp
#include "A.h"
#include "B.h"
namespace ns {
void B::bFunc(A& b) { /* ... */ }
int B::getRand() { /* ... */ }
}

关于c++ - 前向声明类,类重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37522366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com