我在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")
));
这是一个片段从:https://github.com/emilybache/StrangeCharacter-TestDesign-Kata/blob/main/cpp/test-gtest/ExampleCharacterTestCase.cpp
这是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);
2条答案
按热度按时间toiithl61#
问题似乎是你不理解C++中指针的工作方式。来自C#背景,这并不奇怪。
这个
operator==
是一个指针向量。对于Character
,operator==
的重载不会帮助您找到Character
指针。由于不可能为指针重载
operator==
,我建议您要么更改代码以使用Characters
(即std::vector<Character> charactersList = ...
)的向量,或者如果不可能,则使用不同的技术来查找向量中的指针是否指向特定字符。正如评论中已经指出的
是一种完全被误导的说法
你不能把C当作C#的一个小变体来编程。这两种语言非常非常不同。在C#中,你通常用
new
创建对象。在C中,你很少用new
创建对象。hvvq6cgz2#
给你
你有指针的向量。
在这里,你试图将数组的元素(指针)与一个值进行比较,这对于使用C#的人来说是可以理解的。在C++中,这种类型是不可比较的。你知道指针并添加了这个疯狂的
*make_unique
,这不是明智的做法。你需要组合匹配器来从指针访问值。有一个匹配器
testing::Pointee
:同样的事情应该做
ElementsAre
(有更好的方法,但先进)。以下是Live Demo:https://godbolt.org/z/ocTx5hf6W