C++ 交换算法赋予所有内容相同的值
我的课程给了我一个任务,写一个程序,创建52个卡片对象,每个卡片都有一个值和一套。在我们创建一个对象数组之后,我们必须随机切换两张牌的位置。问题是当我去交换我的卡片时,它们都是一样的。以下是导致问题的代码:C++ 交换算法赋予所有内容相同的值,c++,pointers,swap,C++,Pointers,Swap,我的课程给了我一个任务,写一个程序,创建52个卡片对象,每个卡片都有一个值和一套。在我们创建一个对象数组之后,我们必须随机切换两张牌的位置。问题是当我去交换我的卡片时,它们都是一样的。以下是导致问题的代码: void SwapCards(Card* cardOne, Card* cardTwo) { //swap cards here Card *temp = cardOne; *cardOne = *cardTwo; *cardTwo = *temp;
void SwapCards(Card* cardOne, Card* cardTwo) {
//swap cards here
Card *temp = cardOne;
*cardOne = *cardTwo;
*cardTwo = *temp;
//once it gets here all three variables end up with the same object?
}
下面是调用此函数的for循环:
for (int i = 0; i < 104; i++) {
//get two random values and send them to SwapCards to switch both objects
int c_one = RandomRange(0, 51);
int c_two = RandomRange(0, 51);
SwapCards(deck[c_one], deck[c_two]);
}
for(inti=0;i<104;i++){
//获取两个随机值并将其发送到交换卡以切换两个对象
int c_one=随机范围(0,51);
int c_two=随机范围(0,51);
SwapCards(甲板[c_-one],甲板[c_-two]);
}
在此方面的任何帮助都将不胜感激。我花了很多时间想弄明白,但这让我非常困惑。从
Card*temp=cardOne中的temp
中删除*
代码>。改用
Card temp = *cardOne;
然后
“问题是当我去交换我的卡时,它们都是一样的。”
您在此处失去了当前的cardOne
值:
*cardOne = *cardTwo;
由于temp
仍指向与cardOne
相同的地址,cardOne
的原始值未与之一起保存
按如下方式更改代码,以保存cardOne
的值:
Card temp = *cardOne;
*cardOne = *cardTwo;
*cardTwo = temp;
更好(可能更清晰)的解决方案是使用引用而不是指针:
void SwapCards(Card& cardOne, Card& cardTwo) {
//swap cards here
Card temp = cardOne;
cardOne = cardTwo;
cardTwo = temp;
}
void swap(Card &a, Card &b)
{
Card tmp(a); // or Card tmp = a;
a = b;
b = tmp;
}
作为旁注:这是已经做过的,不需要在这里滚动您自己的实现。当您进入该功能时,cardOne
指向一张卡,cardTwo
指向另一张卡
Card *temp = cardOne;
temp
现在指向cardOne
指向的卡
*cardOne = *cardTwo;
cardOne
指向的卡现在与cardTwo
指向的卡具有相同的值
*cardTwo = *temp;
cardTwo
指向的卡现在与temp
指向的卡具有相同的值,这是与cardOne
指向的卡相同的卡–您刚才给出的值与cardTwo
指向的卡相同。
换句话说,这将为*cardtow2
分配与*cardtow2
已经具有的值相同的值
对于交换,您希望保存的是*cardtow2
的值,而不是其地址
Card temp = *cardOne;
*cardOne = *cardTwo;
*cardTwo = temp;
<> >在C++中编写“交换”函数的标准方法是传递引用而不是指针:
void SwapCards(Card& cardOne, Card& cardTwo) {
//swap cards here
Card temp = cardOne;
cardOne = cardTwo;
cardTwo = temp;
}
void swap(Card &a, Card &b)
{
Card tmp(a); // or Card tmp = a;
a = b;
b = tmp;
}
无需调用函数swapCard
,因为参数匹配意味着只能使用两个Card
参数调用该函数
然后可以使用模板使其几乎完全通用:
template <class T> void swap ( T& a, T& b )
{
T tmp(a); // construct a copy of a
a = b; // overwrite 'a'
b = c; // replace 'b' with the copy
}
模板无效掉期(T&a、T&b)
{
T tmp(a);//构造一个
a=b;//覆盖“a”
b=c;//用副本替换“b”
}
这是一个非常常见的范例,它已成为标准-std::swap
如果类型T
兼容,那么它“只工作”,否则您可以为特定类实现模板的“专门化”。有时出于有效的原因需要专门化(例如,您可以交换成员指针,而不是复制其内容)。如果需要引用(以及值temp
),请避免使用指针。deck
)的类型是什么?@anomail他实际上是在解除对cardTwo的引用,并将其分配给解除引用的cardOne。问题在于,temp不是卡的副本,而是指针。请参阅-传递对要交换的项的引用比传递指针更为常见。std::swap
是一个核心构建块。不幸的是,很多人都没有时间去教这些东西,只需要等几分钟就可以了@纳撒诺利弗:好的。很抱歉将会修正。@NathanOliver我认为在这种情况下是可以的:因为Temunish说了“非常感谢”,我们可以假设他接受这个答案,并且因为他是so的新手(从他的代表判断),我们可以假设他要么忘了接受它,要么根本不知道接受答案。我看到了很多带有“谢谢”信息的好答案,但没有被接受(即使这是问题的唯一答案)。@Satus a嘿,你从来没有接受过答案。如果这个答案是正确的,你可能想接受它。最初的评论基本上没有问题。接受这个答案。@Temunish Well另一个帮助吸血鬼OP的例子,接受第一个让他们的代码正常工作的答案,不需要任何解释,也不需要什么可能的改进。唉!我同意,但这是一个家庭作业,我认为指针是作业的一部分。