Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换算法赋予所有内容相同的值_C++_Pointers_Swap - Fatal编程技术网

C++ 交换算法赋予所有内容相同的值

C++ 交换算法赋予所有内容相同的值,c++,pointers,swap,C++,Pointers,Swap,我的课程给了我一个任务,写一个程序,创建52个卡片对象,每个卡片都有一个值和一套。在我们创建一个对象数组之后,我们必须随机切换两张牌的位置。问题是当我去交换我的卡片时,它们都是一样的。以下是导致问题的代码: void SwapCards(Card* cardOne, Card* cardTwo) { //swap cards here Card *temp = cardOne; *cardOne = *cardTwo; *cardTwo = *temp;

我的课程给了我一个任务,写一个程序,创建52个卡片对象,每个卡片都有一个值和一套。在我们创建一个对象数组之后,我们必须随机切换两张牌的位置。问题是当我去交换我的卡片时,它们都是一样的。以下是导致问题的代码:

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的例子,接受第一个让他们的代码正常工作的答案,不需要任何解释,也不需要什么可能的改进。唉!我同意,但这是一个家庭作业,我认为指针是作业的一部分。