注册 登录
编程论坛 C++教室

0和NULL的问题

八画小子 发布于 2011-08-10 14:30, 657 次点击
有一个ValNode类,有两个构造函数,一个接受长整型,另一个接受指向字符串的指针。但在主函数中如果有这样的语句,ValueNode num; num = 0;则会变异出错。猜测是0和空指针发生冲突,请问如何处理。不想大动干戈来改用string类,也不想在0之前加 (unsigned long long)之类的东西,怕以后忘了。
13 回复
#2
八画小子2011-08-10 14:31
但如果把0改为其他的值则编译通过。
#3
jcw081201102011-08-10 14:48
都可以用不过我建议你多用0少用NULL他们是等价的;
你可以定义一个 const int NULL = 0;然后放心得使用 NULL;
#4
xg56992011-08-10 15:03
错误报告是什么?
ValueNode num; num = 0;
将num赋值为0我觉得应该是调用ValueNode 类中的带一个参数的构造函数
即ValueNode(long );
不知道你那个带一个参数的构造函数里面是什么东东了

[ 本帖最后由 xg5699 于 2011-8-10 15:23 编辑 ]
#5
八画小子2011-08-10 16:38
我只不过是举个具体的例子。我是想问,如果0和空指针相互发生冲突的时候,也就是说有代码 =0; 编译器提示可能会认为是空指针时,如何修改程序?
#6
xg56992011-08-10 17:50
回复 5楼 八画小子
发一个简单点的程序具体说明下,不然不能理解你的意思.
#7
八画小子2011-08-10 20:38
设计了一个ValueNode类,其中有两个构造函数
ValueNode(const char * v);和
ValueNode(const unsigned long long x);。
在主函数中有这样几句
ValueNode num;
num = 0;
这是编译不通过,但如果把0换成其他的正值却是可以的。
#8
xg56992011-08-10 21:36
回复 7楼 八画小子
你不把错误或者整个代码发出来怎么能知道错误?
你不清楚定义的对象=0;是调用哪个带参的构造函数你可以做测试
在2个带参的构造函数中添加输出语句,比如
ValueNode(const char * v){cout<<"运行了char构造函数";}和
//ValueNode(const unsigned long long x){cout<<"运行了long构造函数";}
自己调试一下在 ValueNode a;a=0;就只运行这2句,看看可不可以运行,不行在
//ValueNode(const char * v){cout<<"运行了char构造函数";}和
ValueNode(const unsigned long long x){cout<<"运行了long构造函数";}
哪个不能通过就看看哪个程序里有什么问题

#9
lintaoyn2011-08-10 22:09
(char*)0
0L
这是指对你提出的问题的解决方法,编译时出现二义就指明它的类型是什么。
#10
八画小子2011-08-10 23:11
还是9楼和其他的人才是真正的高手,一眼就看出问题的关键,不像8楼的,尽说些无关紧要的问题,还说什么要发代码。
但我是不想在0的前面或后面加些东西,要不以后很难维护代码。万一哪次忘了应该加东西,那就麻烦了,还很难找出问题的所在。
请问有没有解决办法?
#11
lintaoyn2011-08-11 07:49
const char * CPNULL = 0;
const unsigned long  ZEROUL = 0UL;
那就定义一些常量,常量都是有类型的,这样编译器就能识别要调用哪个构造函数。
#12
xg56992011-08-12 11:20
回复 10楼 八画小子
我的确不是高手,目前我只学到了链表而已,连摸板都还没有学,更别说异常处理了
不知道你学了C++多少时间,对于你那种问题我觉得很好笑,告诉你解决方法但你自己连我说的方法看都不看,说我乱说,
你有自己解决问题能力吗?事事都需要说穿吗?!
你那程序很明显就是你定义了两个构造函数 但输入一个0的数字,同时可以调用这2个构造函数,编译器不知道该调用哪个所以报错,
例子:
#include <iostream>
using namespace std;

class A
{
private:
   
public:
    A(){};
    A(long x){};
    A(char *a){};
};

void main()
{
    A a((long)0);
    A b((char*)0);
}



如果你这都看不懂那没办法和你沟通

[ 本帖最后由 xg5699 于 2011-8-12 12:37 编辑 ]
#13
zhoufeng19882011-08-12 11:58
大家都和谐都哈!xg5699也是够意思,为了帮你解决问题。

ValueNode num; num = 0;

我也是看到这段源码之后也会有一些想法的。

首先看num,这个是调用ValueNode的默认构造函数。
num = 0;
,这个又是怎么回事呢?
其实这个语句会去调用ValueNode的拷贝构造函数,而到这里,如果你没有重写拷贝构造函数和构造函数没有指定为explicit(防止构造函数的隐式转换)的话,会尝试将0转换为构造函数的参数类型。再下来就是9楼的了. 0为空指针,可以赋值为指针,也可以赋值给unsigned long long形参,产生二义性。

0有空指针的意思,其他常数就不行了,得通过强制类型转换。

这个问题,是得看你的具体程序,你如果没有给出构造函数是什么样,是无法判断的。
#14
xg56992011-08-12 12:30
回复 13楼 zhoufeng1988
厉害!学习了,关于构造函数的隐式转换我就不清楚了,
 我只知道上面个例子A b((char*)0)可以调用自己想调用的构造函数传递数据,就不会产生二义性了.


[ 本帖最后由 xg5699 于 2011-8-12 12:35 编辑 ]
1