定义一个结构体类型,然后新建一个成员函数,为何就错?代码是。。。 private: struct node{ int key; struct node *left; struct node *right; }treenode,*p;public: node* NewNode(); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我是定义了一个类呀class CTree {private: struct node{ int key; struct node *left; struct node *right; }treenode,*p;public: CTree* NewNode(); BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(); virtual ~CTree();}; class CTree {private: struct node{ int key; struct node *left; struct node *right; }treenode,*p;public: CTree* NewNode(); BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(); virtual ~CTree();};上面的定义没错node* NewNode(); // 这里是错的,因为在该类以外的代码不能引用struct node class CTree {private: struct node{ int key; struct node *left; struct node *right; }treenode,*p;public: CTree* NewNode(); BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(); virtual ~CTree();};这样是没有问题的。你说出错是什么错? 这样:struct node{ int key; node *left; node *right;}treenode,*p; 错在这CTree* CTree::NewNode(){ node t=new CTree();} node 是结构体,是类CTree中的一部分,当然不能把一个CTree对象强制转换为它了——除非你重载=操作符。 我改成node* CTree::NewNode(){}为何也错?? CTree* CTree::NewNode(){ node t=new CTree();}和node* CTree::NewNode(){}有什么关系?两个没有关系啊?上面的是调用构造函数,下面的是一个成员函数 可以先把node单独定义,然后把CTree* CTree::NewNode(){ node t=new CTree();}改成node* CTree::NewNode(){ node t=new node();} node t=new CTree();错了new 返回的是指针,不是类对象。 node是一个结构体数据成员,CTree::NewNode()想返回一个node指针 node是定义的CTree私有结构体。你直接用当然有问题。你这样定义看看:struct node{ int key; struct node *left; struct node *right;}treenode,*p;class CTree {private: struct node treenode,*p; public: CTree* NewNode(); BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(); virtual ~CTree(); }; 还有struct node{ int key; struct node *left; struct node *right;}treenode,*p;class CTree {private: struct node treenode,*p; public: node * NewNode(){return}; BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(); virtual ~CTree(); }; 晕~~~还没有改完~~~class CTree {private: struct node treenode,*p; public: node * NewNode(){return new node;}; BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(){}; virtual ~CTree(){}; };这样你就能这样用了:CTree tree;node * pointer = tree.NewNode(); node是定义的CTree私有结构体。CTree成员函数直接用为何有问题。 没问题啊。比如你这样写:class CTree {private: struct node{ int key; struct node *left; struct node *right; }treenode,*p; public: void NewNode(){p = new node;} // 注意这里 BOOL DeleNode(int val); BOOL InsertNode(int val); CTree(){}; virtual ~CTree(){}; };然后就能这样用: CTree tree; tree.NewNode();注意我加注释的地方没有返回类型。如果有返回类型,那么这个函数只能在成员函数中调用。而且如果你这样写 node* NewNode();那么你也不能把函数体写到类定义外面:node* CTree::NewNode() //不能编译通过,因为node在这里没有定义。{...} 再问pomelowu(羽战士) 我在类定义后,函数体写到类定义外面但是#include"Tree.h"所以说node在这里已经定义了。 用format函数,运行删除数据库表中数据,为什么不成功? 请问如何隐藏图表中的线呢? CListCtrl用法 位图叠加问题 在COM/ATL中,经常提到的宿主文件是什么意思? 怎么使一个窗口一打开就最大化!! 我在CTreeView中加入了上下文菜单,但为什么要双击菜单才出现?? 请问如何在对话框上添加右键菜单?我是新手,请具体一点!谢谢! 如何发布数据库软件? 使用CSocket进行通讯,服务端只有一个,socket本身的规定的客户端的个数的上限大致是多少,还是取决于机器性能? socket编程传送文件格式的请教,英雄救命啊! 来总结一下在VC中调用COM组件的方法(大家来补充)
class CTree
{
private:
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;
public:
CTree* NewNode();
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree();
virtual ~CTree();};
{
private:
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;
public:
CTree* NewNode();
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree();
virtual ~CTree();};
上面的定义没错
node* NewNode(); // 这里是错的,因为在该类以外的代码不能引用struct node
{
private:
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;
public:
CTree* NewNode();
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree();
virtual ~CTree();};
这样是没有问题的。你说出错是什么错?
struct node{
int key;
node *left;
node *right;
}treenode,*p;
CTree* CTree::NewNode()
{
node t=new CTree();
}
node* CTree::NewNode()
{
}
为何也错??
{
node t=new CTree();
}和node* CTree::NewNode()
{
}
有什么关系?两个没有关系啊?
上面的是调用构造函数,下面的是一个成员函数
CTree* CTree::NewNode()
{
node t=new CTree();
}
改成
node* CTree::NewNode()
{
node t=new node();
}
new 返回的是指针,不是类对象。
CTree::NewNode()想返回一个node指针
你这样定义看看:
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;
class CTree
{
private:
struct node treenode,*p;
public:
CTree* NewNode();
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree();
virtual ~CTree();
};
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;class CTree
{
private:
struct node treenode,*p;
public:
node * NewNode(){return};
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree();
virtual ~CTree();
};
{
private:
struct node treenode,*p;
public:
node * NewNode(){return new node;};
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree(){};
virtual ~CTree(){};
};这样你就能这样用了:
CTree tree;
node * pointer = tree.NewNode();
比如你这样写:
class CTree
{
private:
struct node{
int key;
struct node *left;
struct node *right;
}treenode,*p;
public:
void NewNode(){p = new node;} // 注意这里
BOOL DeleNode(int val);
BOOL InsertNode(int val);
CTree(){};
virtual ~CTree(){};
};然后就能这样用:
CTree tree;
tree.NewNode();注意我加注释的地方没有返回类型。如果有返回类型,那么这个函数只能在成员函数中调用。而且如果你这样写
node* NewNode();
那么你也不能把函数体写到类定义外面:
node* CTree::NewNode() //不能编译通过,因为node在这里没有定义。
{
...
}
我在类定义后,函数体写到类定义外面但是#include"Tree.h"所以说node在这里已经定义了。