【发布时间】:2021-09-18 05:01:36
【问题描述】:
我试图在另一个模块中包含一个模块,但由于以下错误,我无法编译:
“无法构建以下源文件,因为它们之间存在循环依赖关系:Module1.ixx 依赖于 Module2.ixx 依赖于 Module1.ixx。”
我希望 modClass1_ 包含 modClass2_ 类,而 modClass2_ 包含指向静态 modClass1_ 的指针。
我使用 C++17 头文件和源文件(.h 和 .cpp)成功尝试的代码
// Class1.h
#pragma once
#include "Class2.h"
class modClass2_;
class modClass1_
{
public:
modClass1_() {};
~modClass1_() {};
int V = 2;
int getV() { return V; };
static modClass2_ mc2;
};
extern modClass1_ mc1;
// Class1.cpp
#include "Class1.h"
modClass1_ mc1;
modClass2_ modClass1_::mc2;
// Class2.h
#pragma once
#include "Class1.h"
class modClass2_
{
public:
modClass2_() {};
~modClass2_() {};
int V = 1;
int getV() { return V; };
int getClass1V();
};
// Class2.cpp
#include "Class2.h"
int modClass2_::getClass1V()
{
return mc1.V;
}
// Main.cpp
#include "Class1.h"
#include <iostream>
int main()
{
std::cout << mc1.getV() << "\n"; // gets modClass1_ V directly
std::cout << mc1.mc2.getClass1V() << "\n"; // gets modClass1_ V through modClass2_ through modClass1_
std::cout << mc1.mc2.getV() << "\n"; // gets modClass2_ V through modClass1_
}
我尝试过但使用 C++20 模块 (.ixx) 失败的代码
// Module1.ixx
export module Module1;
import Module2;
export class modClass1_
{
public:
modClass1_() {};
~modClass1_() {};
int getV() { return V; };
modClass2_ mc2;
int getModule2V() { return mc2.V; };
int V = 1;
};
export modClass1_ mc1;
// Module2.ixx
export module Module2;
import Module1;
export class modClass2_
{
public:
modClass2_() {};
~modClass2_() {};
int getV() { return V; };
int getModule1V() { return mc1.V; };
int V = 2;
};
任何帮助/建议将不胜感激。
环境:Visual Studio 2019 | MSVC-2019 | C++20 |视窗 10 专业版
【问题讨论】:
-
为什么
Class2.h需要包含Class1.h?要声明一个指针变量,你只需要一个前向声明。 -
循环依赖是不好的做法。好的代码不应该存在,除了特定情况(例如树类和节点定义在单个翻译单元中,一个是其他的实现细节)。
-
模块仍然可以有单独的接口和实现翻译单元。
-
@某程序员老兄,我尝试了前向声明,但模块无法编译。
-
@Nathan Pierson 你能给我一个例子如何在这些代码中实现单元吗?
标签: c++ module c++20 c++-modules cyclic-dependency