c++ 指针 类 紧急!!求助。。

UNIX1024 2014-04-08 10:01:04
using namespace std;
class Card
{
public:
Card() { value=1; }
void getText() { cout<<"("<<value<<")"<<endl; }
private:
int value;
};

class Poker
{
public:
Poker() { Card d ; car = &d; }
void getCard()
{
car->getText();
}
private:
Card *car;
};

int main()
{
Poker p; //-----------------------!!!!!!!!!!!!!!!!!!--------------第一行
p.getCard();

Card c; //-------------------------!!!!!!!!!--------------------第二行
c.getText();
return 0;
}

这程序:
看主函数中,我标记的第一行,我的目的是,创建Poker对象,Poker构造函数中默认创建Card对象,并取地址赋给 Poker中的car, 调用Poker中的 getCard()函数 应该能输出 Card对象中的 value值呀?
而我运行的结果却是:(1244996)
第二行:我直接创建 Card对象,并调用getText函数 是可以输出value值的。
第一行中怎么能够通过指针获得value值呀???我试过很多次了。。。
...全文
197 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rmaly 2014-04-10
  • 打赏
  • 举报
回复
指针是野指针了,可以用new的方式,不过记得delete
火头军 2014-04-09
  • 打赏
  • 举报
回复
引用 6 楼 u014246256 的回复:
刚才查了一下书, 是不是将 Card 声明为静态就可以了啊? 那么或者创建对象时用new 行吗,是不是用new创建的对象不会自动释放,只有在delete后才释放呢?
不建议乱用 static 。。。 可以new ,记得给指针初始化null ,new和delete要匹配 ,不要内存泄露
赵4老师 2014-04-09
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
「已注销」 2014-04-09
  • 打赏
  • 举报
回复
Poker() { Card d ; car = &d; } ;注意到了大括号没?car确实是变量d的指针,但是它是临时变量,出了括号,d被释放了,从而car成了野指针,内容不确定
vcgaoshou 2014-04-09
  • 打赏
  • 举报
回复
Poker() { Card d ; car = &d; } 中的d是局部于Poker()的对象,构造函数运行结束,d就析构啦,建议如下修改 class Card { public: Card() { value=1; } void getText() { cout<<"("<<value<<")"<<endl; } virtual ~Card(){} private: int value; }; class Poker { public: Poker(int n) { car = new Card(n) ; } void getCard() { car->getText(); } ~Poker(){delete car;} private: Card *car; };
ri_aje 2014-04-09
  • 打赏
  • 举报
回复
Poker 里面直接用 Card 对象就行了,干吗非得用指针啊。
UNIX1024 2014-04-08
  • 打赏
  • 举报
回复
刚才查了一下书, 是不是将 Card 声明为静态就可以了啊? 那么或者创建对象时用new 行吗,是不是用new创建的对象不会自动释放,只有在delete后才释放呢?
孤影品茗 2014-04-08
  • 打赏
  • 举报
回复
你第一行里面的card对象是个临时对象,在构造调用完成后就被析构了,指针所指向的内容也是不确定的了,输出的值就不对了
UNIX1024 2014-04-08
  • 打赏
  • 举报
回复
那么,构造函数执行完后,Card对象在内存中还存在吗? 是将Card对象的内存清空了吗? 若果是这样,那上面应该怎么该怎么修改呀?
f_liu 2014-04-08
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
class Card
{   
public:
	Card()  {   value=1;    }
	void getText()   { cout<<"("<<value<<")"<<endl;   }
private:
	int value;
};

class Poker
{
public:
	Poker()    {  car = &d;     }    
	void getCard()
	{
		car->getText();
	}
private:
	Card *car;  
	Card d;
};

int main()
{
    Poker p;      //-----------------------!!!!!!!!!!!!!!!!!!--------------第一行
    p.getCard();
	
    Card c;       //-------------------------!!!!!!!!!--------------------第二行
    c.getText();
    return 0;
}
ithiker 2014-04-08
  • 打赏
  • 举报
回复
Poker() { Card d ; car = &d; } car指向了一个局部的d的地址,在构造函数结束之后,d已经释放了,就取不到期望的值了
dbzhang800 2014-04-08
  • 打赏
  • 举报
回复
d 出了你的Poker的构造函数就析构了,car是野指针

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧