我在 C# 中进行了此练习,我正试图将其转换为 C++。 我想像在 C# 中一样使用匹配器进行一些谷歌测试来检查集合内容。容器中的元素是一个用户定义的 ValueObject,它实现了 == 运算符,因此具有相同数据的对象是相等的。
它不起作用,我不知道为什么?
这就是我想写的:
std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");
ASSERT_THAT(charactersList, testing::Contains(*std::make_unique<Character>("Nancy", "Wheeler")));
ASSERT_THAT(charactersList, testing::ElementsAre(
*std::make_unique<Character>("Nancy", "Wheeler"),
*std::make_unique<Character>("Mike", "Wheeler"),
*std::make_unique<Character>("Karen", "Wheeler")
));
这是有效的 C# 版本:
CollectionAssert.Contains(charactersList, new Character("Nancy", "Wheeler"));
CollectionAssert.AreEquivalent(new List<Character>()
{
new Character("Nancy", "Wheeler"),
new Character("Mike", "Wheeler"),
new Character("Karen", "Wheeler"),
}, charactersList);
问题似乎是您不了解指针在 C++ 中的工作方式。来自 C# 背景,这并不奇怪。
这个
std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");
是指针向量。没有为
operator==
重载 Character
将帮助您找到 Character
指针。
由于不可能为指针重载
operator==
,我建议您更改代码以使用Characters
(即std::vector<Character> charactersList = ...
)的向量,或者如果那不可能,请使用不同的技术来查找是否有一个矢量中的指针指向特定字符。 编辑: 正如 Marek R 所指出的,不同的技术已经用 testing::Pointee
)
正如评论中已经指出的
*std::make_unique<Character>("Nancy", "Wheeler")
是完全错误的说法
Character("Nancy", "Wheeler")
你不能像 C# 上的一些小变体一样编写 C++。这两种语言非常不同。在 C# 中,您通常使用
new
创建对象。在 C++ 中,您很少使用 new
. 创建对象
这里
std::vector<Character *> charactersList = finder.FindFamilyByLastName("Wheeler");
你有指针向量。
ASSERT_THAT(charactersList, testing::Contains(*std::make_unique<Character>("Nancy", "Wheeler")));
在这里,您正在尝试将该数组的元素(指针)与一个值进行比较,这对于使用 C# 较多的人来说是可以理解的。在 C++ 中,此类型不可比较。 你在哪里知道指针并添加了这个疯狂的
*make_unique
这不是明智的做法。
您需要编写匹配器以从指针访问值。有匹配器
testing::Pointee
:
ASSERT_THAT(charactersList, testing::Contains(testing::Pointee(Character("Nancy", "Wheeler"))));
应该为
ElementsAre
做同样的事情(有更好的方法,但要先进)。
这里是现场演示:https://godbolt.org/z/ocTx5hf6W