gpt4 book ai didi

c++ - 标题互相需要

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

此问题已关闭,因为它被认为与以下内容重复:

  1. C++ cyclical header dependency
  2. cyclic dependency between header files
  3. C++ error: 'Line2' has not been declared

但是另一个问题与我的不同:他们问的是不同的案例,答案不适用于我的问题。他们的回答建议将函数放入 .cpp 文件并在声明它之前定义类。我不能将函数放在 .cpp 中,因为我的类是模板,而且我已经定义了类,但它没有用。


我有两个头文件a.hb.h。在它们中定义了两个模板类 AB

A 的函数需要与B 的对象一起工作,反之亦然。由于它们是模板类,我不能将函数放在.cpp 文件中,它必须放在header 中,而且我很头疼,因为包含的顺序。

什么是解决这个问题的好方法?

目前我四处移动函数定义并找到一种方法以正确的顺序包含标题,但这总是变得更加复杂。此外,我不喜欢函数定义远离类声明(例如在其他文件中)。


示例代码:

啊.h

#ifndef A_H
#define A_H

#include <iostream>
#include "b.h"
template< typename T > class B;

template< typename T >
class A {
public:
B<void> *b;
void f();
void g();
};
template< typename T > void A<T>::f() {
std::cout << "A::f" << std::endl;
b->f();
}
template< typename T > void A<T>::g() {
std::cout << "A::g" << std::endl;
}

#endif

b.h

#ifndef B_H
#define B_H

#include <iostream>
#include "a.h"
template< typename T > class A;

template< typename T >
class B {
public:
A<void> *a;
void f();
void g();
};
template< typename T > void B<T>::f( ) {
std::cout << "B::f" << std::endl;
}
template< typename T > void B<T>::g( ) {
std::cout << "B::g" << std::endl;
a->g();
}

#endif

main.cpp

#include "a.h"
#include "b.h"
int main( ) {
A<void> a;
B<void> b;
a.b = &b;
b.a = &a;

a.f();
b.g();

return 0;
}

这不起作用,因为 a.h 包含 b.hb.h 则不能包含 a.h 因此 B::g 是错误的。

对于此示例代码,我可以将 B::g 移动到 main.cppa.h 的末尾,但更复杂编程这并不容易。

最佳答案

实际上,您的代码在我的 Visual C++ 上按原样编译。原因是编译器在实际调用函数之前不会“内部”查看函数,即在您的情况下直到 main.cpp

坦率地说,我不确定标准是否保证了这一点。如果不是,您始终可以将 header 拆分为“独立”和“依赖”部分,如下所示:

a_forward.h

#ifndef A_FORWARD_H
#define A_FORWARD_H

template< typename T > class B;

template< typename T >
class A {
public:
B<T> *b;
void f();
void g();
};

#endif

啊.h

#ifndef A_H
#define A_H

#include <iostream>
#include "a_forward.h"
#include "b_forward.h"

template< typename T > void A<T>::f() {
std::cout << "A::f" << std::endl;
b->f();
}

template< typename T > void A<T>::g() {
std::cout << "A::g" << std::endl;
}

#endif

b_forward.h

#ifndef B_FORWARD_H
#define B_FORWARD_H

template< typename T > class A;

template< typename T >
class B {
public:
A<T> *a;
void f();
void g();
};

#endif

b.h

#ifndef B_H
#define B_H

#include <iostream>
#include "a_forward.h"
#include "b_forward.h"

template< typename T > void B<T>::f( ) {
std::cout << "B::f" << std::endl;
}

template< typename T > void B<T>::g( ) {
std::cout << "B::g" << std::endl;
a->g();
}

#endif

main.cpp

---||---

关于c++ - 标题互相需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394980/

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