C++20模块“循环依赖”
我正在尝试将一个模块包括在另一个模块中,但由于以下错误而无法编译:
";无法生成以下源文件,因为它们之间存在循环依赖关系:module1.ixx依赖于module2.ixx。";
我想要modClass1_CONTAINE modClass2_CLASS和modClass2_CONTAINE指向静态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() << "
"; // gets modClass1_ V directly
std::cout << mc1.mc2.getClass1V() << "
"; // gets modClass1_ V through modClass2_ through modClass1_
std::cout << mc1.mc2.getV() << "
"; // 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|Windows 10专业版
解决方案
就像头文件一样,您可以将模块接口文件与模块实现文件分开。示例:
模块1.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;
模2.ixx:
export module Module2;
export class modClass2_
{
public:
modClass2_() {};
~modClass2_() {};
int getV() { return V; };
int getModule1V();
int V = 2;
};
模2.cpp:
import Module1;
import Module2;
int modClass2_::getModule1V()
{
return mc1.V;
}
main.cpp:
#include <iostream>
import Module1;
import Module2;
int main()
{
// NB: mc1 is a symbol imported from Module1
std::cout << "mc1.V: " << mc1.V << '
';
std::cout << "mc1.getModule2V: " << mc1.getModule2V() << '
';
modClass2_ mc2;
std::cout << "mc2.V: " << mc2.V << '
';
std::cout << "mc2.getModule1V: " << mc2.getModule1V() << '
';
}
请注意,modClass2_
的接口不需要来自Module1
的任何内容,因此Module2.ixx
不需要import Module1;
。Module2.cpp
实现所在的接口需要。
在我的示例中,我尽可能少地从Module2.ixx
移到Module2.cpp
实现文件中,但在实践中,您很可能希望将更多内容移出接口。
相关文章