在另一个

时间:2016-11-24 09:08:40

标签: c++

我有两个功能,如下所示。我想做的很简单。要使用
Toh2的变量(int dskToMv,int cLocation,int tmpLocation,int fLocation)并在Toh函数中打印它们,如下所示:

cout<<" Move one disk from the "<< orpeg << " to the "
    << depeg<< cLocation << "->" << fLocation <<  <<endl;

以下是两个功能:

    void ToH2(int dskToMv, int cLocation, int tmpLocation, int fLocation)
{
//function to print the numbers
     if( dskToMv != 0 ) 
    {
        ToH2( dskToMv-1, cLocation, fLocation, tmpLocation );

  //The below print is what I want to use in the Toh2 function
 // cout << cLocation << "->" << fLocation << endl;
                    ToH2( dskToMv-1, tmpLocation, cLocation, fLocation );
    }
}

void ToH(int dskToMv, string orpeg, string expeg, string depeg) 
{


    if( dskToMv != 0 ) 
    {
        ToH( dskToMv-1, orpeg, depeg, expeg );//original peg(A),extra peg(B),destination peg(C)

    //print in this cout the two additional variables from ToH2
        cout<<" Move one disk from the "<< orpeg << " to the " << depeg  <<endl;
        ToH(dskToMv-1, expeg, orpeg, depeg );
    }


}



       int main()
        {


   int c;
cout << "Enter the number of disks: ";
cin >> c;

ToH(c, "original peg ", "extra peg", "destination peg");

return 0;
        }

输入3时的输出
将一个磁盘从原始挂钩移动到目标挂钩

将一个磁盘从原始挂钩移动到额外的挂钩

将一个磁盘从目标挂钩移动到额外的挂钩

将一个磁盘从原始挂钩移动到目标挂钩

将一个磁盘从额外的挂钩移动到原始挂钩

将一个磁盘从额外的挂钩移动到目标挂钩

将一个磁盘从原始挂钉移动到目标挂钩

我想做什么:
将一个磁盘从原始挂钉移动到目标挂钉1-> 3

将一个磁盘从原始挂钉移动到额外的挂钉1-> 2

将一个磁盘从目标挂钩移动到额外的挂钩3-> 2

将一个磁盘从原始挂钩移动到目标挂钉1-> 3

将一个磁盘从额外的挂钉移动到原始挂钉2-> 1

将一个磁盘从额外的挂钩移动到目标挂钩2-> 3

将一个磁盘从原始挂钩移动到目标挂钉1-> 3

3 个答案:

答案 0 :(得分:3)

你理智的选择是:

  1. 将第一个函数的局部变量传递给第二个函数。这通常是独立功能的沟通方式。如果需要,可以重载第二个函数。
  2. 创建一个封装两个函数功能的对象。共享变量成为成员变量。
  3. 其他(此处不太合适)方法是lambda函数和std::bind

    不太合理的选择是将共享变量设为全局变量。不推荐。

答案 1 :(得分:1)

你想要做的事情是不可能的,并没有多大意义。

函数的参数仅在调用该函数时存在 如果你想让另一个函数使用它们的值,你需要第一个函数调用该函数并以某种方式将这些值传递给它。
特别是,如果我调用了不同的函数,则无法找到“相应参数的值”。

将功能合二为一。

void ToH(int dskToMv, int cLocation, string orpeg, int tmpLocation, string expeg, int fLocation, string depeg)
{
     if( dskToMv != 0 ) 
    {
        ToH( dskToMv-1, cLocation, orpeg, fLocation, depeg, tmpLocation, expeg);
        cout<<" Move one disk from the "<< orpeg << " to the " << depeg
            << " " << cLocation << " -> " << fLocation << endl;
        ToH( dskToMv-1, tmpLocation, expeg, cLocation, orpeg, fLocation, depeg);
    }
}

int main()
{
    int c;
    cout << "Enter the number of disks: ";
    cin >> c;
    ToH(c, 1, "original peg ", 2, "extra peg", 3, "destination peg");
}

或者,您可以使用表格

void ToH(int dskToMv, int cLocation, int tmpLocation, int fLocation)
{
    static std::string names[] = {"original peg", "extra peg", "destination peg"};
    if( dskToMv != 0 ) 
    {
        ToH( dskToMv-1, cLocation, fLocation, tmpLocation);
        cout<<" Move one disk from the "<< names[cLocation - 1] << " to the " << names[fLocation - 1]
            << " " << cLocation << "-> " << fLocation << endl;
        ToH( dskToMv-1, tmpLocation, cLocation, fLocation);
    }
}


int main()
{
    int c;
    cout << "Enter the number of disks: ";
    cin >> c;
    ToH(c, 1, 2, 3);
}

答案 2 :(得分:0)

声明命名空间:

namespace mySpace {
       int dskToMv;
       // other variable
}

并从以下任何函数访问变量:

mySpace.dskToMv =20;
// .....
cout<<mySpace.dskToMv;

这是在函数之间共享变量的一般方法。无论如何,似乎你实施了河内的塔。好吧,你的代码在逻辑上是不正确的。