大家好我正在尝试将存储在数组中的纸牌游戏切成两半,我只想知道我是否可以使用我的功能返回两个不同的数组
string* couperJeu(int idJoueur, string tab[52]){
string jeuJoueur1[26];
string jeuJoueur2[26];
if (idJoueur == 0){
for (int i = 0; i < 26; i++) {
jeuJoueur1[i] = tab[i];
}
}
if (idJoueur == 1){
for (int y = 26; y < 52; y++) {
jeuJoueur2[y] = tab[y];
}
}
return(jeuJoueur1, jeuJoueur2);
}
答案 0 :(得分:1)
如果您使用std::array
而不是原始数组,则可以使用
std::array<std::array<std::string, 26>, 2> couperJeu(int idJoueur, string tab[52]) {
std::array<std::array<std::string, 26>, 2> jeuJoueur;
// fill jeuJoueur[0]/jeuJoueur[1] instead of jeuJoueur1/jeuJoueur2
return jeuJoueur;
}
但你不应该。您只填写jeuJoueur1
或jeuJoueur2
,而不是两者都填写。因此,没有理由同时返回。
答案 1 :(得分:1)
由于这是一个C ++问题,您应该使用C ++数据类型,例如std::vector
,这将简化您的代码。
const int DECKSIZE = 52;
std::pair<std::vector<card>, std::vector<card> > cut(
int idPlayer, std::vector<card> arr)
{
std::vector<card> a;
std::vector<card> b;
if (idPlayer == 0)
for (int i = 0; i < DECKSIZE / 2; ++i)
a.push_back(arr[i]);
if (idPlayer == 1)
for (int i = DECKSIZE / 2; i < DECKSIZE; ++i)
b.push_back(arr[i]);
return std::make_pair(a, b);
}
请注意使用DECKSIZE
代替幻数52
和26
。这提高了代码的可读性。
但是你建议的代码确实没有意义 - 如果你正在填充其中一个数组,为什么要返回这两个?
答案 2 :(得分:0)
您可以尝试使用例如 std :: pair&lt;&gt; 或定义结构以返回两个参数
答案 3 :(得分:0)
执行您需要执行的操作的另一种方法是使两个数组成为全局数组,然后创建一个void函数来执行所需的所有操作。当然你可以使用向量而不是数组,但如果你是c ++的新用户,我推荐数组。
答案 4 :(得分:0)
另一种方法是将引用作为参数传递给函数,或者在C风格的代码中传递指针。然后,该函数可以通过引用修改对象,并且调用者可以看到更改。这样做的好处是,更新阵列比使用深层复制更有效,并且您可以根据需要更新任意数量的对象,而无需管理内存。
另一方面,返回临时vector
或string
对象(不对临时的引用,这是非法的)将进行优化以提高效率浅拷贝。您还可以通过将其包含在智能shared_ptr
或unique_ptr
中来强制将此行为用于其他类型的参数。并使您的函数通过返回值返回信息,而不是副作用,是一种更加功能的样式,更易于调试和分析。