gpt4 book ai didi

c++ - 引用放置的 map 值需要类的定义

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

我需要更改在我正在处理的大型项目中包含 header 的方式。我能够用一个更小的单一程序模拟我目前遇到的错误。

例如,编译如下:

#include <map>

class C;

class A {
public:
C& add();
std::map<int,C> Cmap;
void dosomethingwithC();
};

class B {
public:
A& add();
std::map<int,A> Amap;
};

class C {
public:
B& add();
std::map<int,B> Bmap;
};

int main()
{
C c;
auto& emplacedB = c.add();
auto& emplacedA = emplacedB.add();
auto& emplacedC = emplacedA.add();
emplacedC.add();
return 0;
}

C& A::add()
{
auto emplace_results = Cmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}

B& C::add()
{
auto emplace_results = Bmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
//auto& emplaced_pair = *pair_iterator;
std::pair<const int,B>& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}

A& B::add()
{
auto emplace_results = Amap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;;
}

void A::dosomethingwithC()
{
Cmap[3].add();
}

但是,如果我将 A 的函数定义移动到更靠近 A 的位置,则以下代码不会编译:

#include <map>

class C;

class A {
public:
C& add();
std::map<int,C> Cmap;
void dosomethingwithC();
};

C& A::add()
{
auto emplace_results = Cmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}

class B {
public:
A& add();
std::map<int,A> Amap;
};

class C {
public:
B& add();
std::map<int,B> Bmap;
};

int main()
{
C c;
auto& emplacedB = c.add();
auto& emplacedA = emplacedB.add();
auto& emplacedC = emplacedA.add();
emplacedC.add();
return 0;
}

B& C::add()
{
auto emplace_results = Bmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
//auto& emplaced_pair = *pair_iterator;
std::pair<const int,B>& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}

A& B::add()
{
auto emplace_results = Amap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;;
}

void A::dosomethingwithC()
{
Cmap[3].add();
}

即使声明了 class C,我仍然收到错误。该错误说明 std::pair 使用 undefined class C

构造 header 和包含以进行编译的正确方法是什么?

最佳答案

方法

  • 所有声明都必须放在标题中,
  • 所有定义都放入 .cpp 文件中。
  • 没有一个标题相互包含。

在此特定实例中,如果所有 . cpp 文件包括所有声明。 (A需要C,但C需要B)

因此即使错误是由于缺少定义,也可以通过包含声明来解决。我不确定为什么会发布 separate question .

解决方案

啊啊

#ifndef A_h
#define A_h

#include <map>

class C;

class A {
public:
C& add();
std::map<int,C> Cmap;
void dosomethingwithC();
};

#endif

B.h

#ifndef B_h
#define B_h

#include <map>

class A;

class B {
public:
A& add();
std::map<int,A> Amap;
};

#endif

C.h

#ifndef C_h
#define C_h

#include <map>

class B;

class C {
public:
B& add();
std::map<int,B> Bmap;
};

#endif

A.cpp

#include "A.h"
#include "B.h" // also required here
#include "C.h"

C& A::add()
{
auto emplace_results = Cmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}


void A::dosomethingwithC()
{
Cmap[3].add();
}

B.cpp

#include "A.h"
#include "B.h"
#include "C.h" // also required here

A& B::add()
{
auto emplace_results = Amap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
auto& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;;
}

C.cpp

#include "A.h" // also required here
#include "B.h"
#include "C.h"

B& C::add()
{
auto emplace_results = Bmap.emplace(std::piecewise_construct,
std::forward_as_tuple(3),
std::forward_as_tuple());
auto pair_iterator = emplace_results.first;
//auto& emplaced_pair = *pair_iterator;
std::pair<const int,B>& emplaced_pair = *pair_iterator;
auto& map_value = emplaced_pair.second;
return map_value;
}

main.cpp

#include "A.h"
#include "B.h"
#include "C.h"

int main()
{
C c;
auto& emplacedB = c.add();
auto& emplacedA = emplacedB.add();
auto& emplacedC = emplacedA.add();
emplacedC.add();
return 0;
}

关于c++ - 引用放置的 map 值需要类的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36666368/

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