我试图在另一个模块中包含一个模块,但由于以下错误无法编译:
“无法生成下列源文件,因为它们之间存在循环依赖关系:Module1.ixx依赖于Module2.ixx依赖于Module1.ixx。
我希望modClass 1_ contain modClass 2_ class和modClass 2_ contain一个指向静态modClass 1_的指针。
代码我尝试了成功与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_
}
代码i尝试了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;
};
任何帮助/建议将不胜感激。
环境:可视化工作室2019|MSVC-2019|C++20|Windows 10专业版
3条答案
按热度按时间6vl6ewon1#
就像头文件一样,你可以将模块接口文件从模块实现文件中分离出来。例如:
Module1.ixx:
Module2.ixx:
Module2.cpp:
main.cpp:
请注意,
modClass2_
的接口不需要Module1
的任何东西,因此Module2.ixx
没有import Module1;
。在我的例子中,我已经尽可能少地从
Module2.ixx
移到Module2.cpp
实现文件中,但实际上您可能希望从接口中移出更多内容。i2byvkas2#
我有一个树数据结构分为两个模块,需要相互引用,和posted an answer如何使它工作。复制粘贴它,这里是一个绝望的解决方案,通过使用模板打破循环依赖:
目前clang不支持模块分区,因此使用该工具链,这似乎是在不同文件中定义A和B的唯一方法(没有
#include
),同时将它们放置在模块中。bmvo0sr53#
经过gcc测试,模块分区可以使用前向声明和内部模块链接来解决这个问题。这并没有设置模块相互依赖,整个循环依赖关系在单个模块中定义。