如何在主要的C ++类中编写解释器函数

时间:2010-03-31 01:13:58

标签: c++ visual-studio-2008

我正在开展一个关于数据结构的项目。 在第一篇文章中,我在main中写了所有内容,但听起来像C语言。但是,据我所知,我试图在我的main()方法中尽可能少地考虑OOP。

我在我的课程中实现了一些操作,比如add,delet,find.it太容易实现了。

class ARB
{
        private:
                struct BT
                {
                        int data;
                        BT *l;
                        BT *r;
                };
                struct BT *p;
       public
                ARB();
                ~ARB();
                void del(int n);
                void add(int n); 
};

    void ARB::del(int num)
{
//The code ,don't care about it 

  };  

main()
{
// 
    BTR T;
    T.add(3);
    T.add(5);

};

但是我到了大项目 如何定义必须使用二叉树并获得堆栈的方法

STACK ARB::MyFunct(BT* p)
{
// The code don't care about it 
}

如何在主程序中应用

main()
{
// 
    BT T;
    T.add(3);
    T.add(5);
    STACK S;
    BT* p
    S=T.MyFunct(p); // error C2664 cannot convert parametre 1

};

**提到:我实现了STACK类

4 个答案:

答案 0 :(得分:0)

看起来可能是STACK类'复制赋值运算符'未正确定义,例如:

class STACK {
public:
    ...
    STACK& operator=(STACK& right); // copy assign
    ...
};

在这种情况下,复制构造函数要求它可以修改right,但STACK返回的ARB::MyFunct()是临时的,不能修改。 尝试将复制构造函数更改为STACK(STACK const& right),因此C ++知道您不会修改它。 如果您使用的是支持R值引用的编译器(例如,Visual Studio 2010),那么您可以定义“移动构造函数”以及复制构造函数:

class STACK {
public:
    STACK& operator=(STACK const& right); // copy assign: note 'const'
    STACK& operator=(STACK&& right); // move assign: note no 'const', double '&'.
    ...
};

只会使用临时值调用此值,允许修改它。

相同的规则适用于构造函数:

class STACK {
public:
    STACK();
    STACK(STACK const& right); // copy construct
    STACK(STACK&& right); // move construct
    STACK& operator=(STACK const& right); // copy assign
    STACK& operator=(STACK&& right); // move assign
    ...
};

int main() {
    STACK S = T.MyFunct(p); // move construct S (right side is temporary)
    S = T.MyFunct(p); // move assign S (right side is temporary)

    STACK K = S; // copy construct K (right side is not temporary)
    K = S; // copy assign K (right side is not temporary)
}

答案 1 :(得分:0)

我假设您正在尝试遍历树并从中构建堆栈?我不明白为什么你要传递p。在您的示例中,您似乎只是创建了一个指向BT对象的指针,然后您尝试将其传入。

这似乎更有意义:

S=T.MyFunct();

你不能使用this来构建你的树吗?我想我不确定你要做的是什么。

假设您正在尝试为将BT转换为堆栈的BT对象实现一个函数,那么您实际上并不需要传递任何内容(因为{{1} }是MyFunct)的成员函数。您已经可以访问成员函数中的树,因此您只需要遍历树并构建堆栈。

注意:我的C ++非常生疏。

答案 2 :(得分:0)

首先,如果更改第5行和第6行,可能会有所帮助。

/ * CODE:在主体内 1 BT T;
2 T.add(3);
3 T.add(5);
4堆栈S;
5 BT * p
6 S = T.MyFunct(p); //错误C2664无法转换参数1 * /

第5行: BT * p; - > BT * p =& T;
第6行: S = T.MyFunct(p) - > S = ARB :: MyFunct(P);
现在假设MyFunct做了它想做的事情,它应该工作。该程序的主要问题是指针p未初始化,实际上将参数减少为void。另外,我假设MyFunct没有对象关系,所以在这种情况下引用T没有多大意义。这就是为什么我建议改为后一版本。

答案 3 :(得分:0)

这里有一些问题。首先,add()是ARB的成员函数,而不是BT。并且,BT是ARB的私有子类,因此无法从main()访问它。 p是ARB的私有成员(应该是它),但它应该是一个直接变量,而不是指针,因此它将使用ARB自动创建和销毁。因为,p永远不会被初始化,并且没有办法从ARB外部这样做。

我猜这里ARB使用其内部BT p进行内部存储,因此add()和del()的实现都在p上运行,并且MyFunct()应该接受该BT并生成一个堆栈从中。如果是这样,MyFunct()应该不带参数,只需直接引用p。

所以main()看起来像是:

ARB arb;
arb.add(3)
arb.add(5)
STACK s = arb.myFunct(); // which should maybe be makeStack() or such

这是假设我在这里正确推断出你的意图。