我正在开展一个关于数据结构的项目。 在第一篇文章中,我在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类
答案 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
这是假设我在这里正确推断出你的意图。