大哥救救菜鸟小弟。。。晕啊。。。

wwx8489 2004-08-11 10:32:53
Account是一个父类,personalAccount和companyAccount是两个子类实现银行帐户的链表管理,分别管理一个个人帐户链表和公司帐户链表

每次当我想遍历personalAccount和companyAccount链表时用如下for语句:

for (personalAccount* pS=personalAccount::First();pS->Next();pS=pS->Next())
{
if (pS->AccountId()>21000000&&pS->AccountId()<22000000)
{
//..................

personalAccount::First();中First()、Next()、AccountId()分别是父类Account中定义的返回头指针、下一结点指针、帐号的函数

编译时所有这种for语句都是这种错误:
F:\wwx\main\Main.cpp(208) : error C2440: 'initializing' : cannot convert from 'class Account *' to 'class personalAccount *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

晕啊。。。。。personalAccount 不就是Account的一个子类吗????
那么如何遍历子类的链表呢??????????????????
...全文
204 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldjackyone 2004-08-19
  • 打赏
  • 举报
回复
你就不能写一个简单的测试程序么?

for(personalAccount* pS=personalAccount::First();pS->Next();pS=pS->Next())
~~~~~~~~~~~~~~~
这句话是错误的,上面的好多同志都提出来了,为什么你就不去考虑这个问题呢?



还有就是 RookieStar(★)(巴巴罗萨)说得挺对的,你可以把它写成:

for(Account* pS=personalAccount::First();pS->Next();pS=pS->Next())

然后你再定义一个personalAccount pSS;进行访问personalAccount里面的成员函数不就可以了么?
wwx8489 2004-08-19
  • 打赏
  • 举报
回复
我在for里定义的pS是访问该链表的每一个结点,如果在for语句里定义一个personalAccount pSS,那么我如何把pSS和pS关联起来呢
wwx8489 2004-08-19
  • 打赏
  • 举报
回复
还有,personalAccount和personalAccount像我这样写,到底是不是两个独立的链表结构啊?
wwx8489 2004-08-19
  • 打赏
  • 举报
回复
oldjackyone(老兔子)(灌水是我无言的抗议) :

那么for(Account* pS=personalAccount::First();pS->Next();pS=pS->Next())这句是遍历的personalAccount链表吗?pS是Account*,Account中的Next()函数怎么知道是personalAccount的还是companyAccount的呢?

遍历companyAccount链表难道是这样吗:
for(Account* pS=companyAccount::First();pS->Next();pS=pS->Next())
flipcode 2004-08-18
  • 打赏
  • 举报
回复
"晕啊。。。。。personalAccount 不就是Account的一个子类吗????"

--------- 你那是向下转换,是不充许的。不过如果你确信是正确的话
可以用静态强制转换static_cast或是动态安全转换dynamic_case。
不过还是建议你换成向上转换。
wwx8489 2004-08-18
  • 打赏
  • 举报
回复
唉唉还是没有人回答小弟吗?...
ForumExplorer 2004-08-13
  • 打赏
  • 举报
回复
UP~~~~~~~~
----------------------
《CSDN论坛新助手 CSDN's forum Explorer》
1、更快速的浏览
2、更方便地保存
3、更快捷的收/发短信
下载地址:http://www.seeyou.com.cn/CoolSlob/CSDNExplorer.exe
更多说明:http://community.csdn.net/Expert/TopicView.asp?id=3255966
RookieStar 2004-08-12
  • 打赏
  • 举报
回复
我的意思是:
personalAccount list; // 表头结点,非元素结点
for(Account* ptr=&list; ptr->Next(); ptr=ptr->Next()) ...

用Upcast,写法简单,一了百了!
Next()什么的都做成virtual,不要static method,因为只能访问static field。这样看上去更顺眼而不用强制转型了。

仔细研究数据结构中链表的写法,差不多的。
wwx8489 2004-08-12
  • 打赏
  • 举报
回复
personalAccount list; // 表头结点,非元素结点
for(Account* ptr=&list; ptr->Next(); ptr=ptr->Next()) ...

这样在for语句里我就不能用ptr访问personalAccount 和companyAccount的成员函数了啊!
wwx8489 2004-08-12
  • 打赏
  • 举报
回复
personalAccount list; // 表头结点,非元素结点
for(Account* ptr=&list; ptr->Next(); ptr=ptr->Next()) ...

可以分别遍历personalAccount 和comapnyAccount两个链表吗?
wwx8489 2004-08-12
  • 打赏
  • 举报
回复
UPcast怎么写?向上转型?
Jinhao 2004-08-11
  • 打赏
  • 举报
回复
用std::list吧
wwx8489 2004-08-11
  • 打赏
  • 举报
回复
我想知道,该如何操作类的链表,比如这里我用Account派生了两个子类,那么在程序中该如何插入结点、删除结点、遍历链表呢?????????????

谢谢了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
wwx8489 2004-08-11
  • 打赏
  • 举报
回复
这里是三个类:

class Account
{
public:
Account(int,float,int,char*,int); //构造函数
int AccountId(); //返回accId
int AccountPost(); //返回postNum
char* AccountTel(); //返回telNum
int AccountPassword(); //返回password
float AccBalance(); //返回balance
static Account* First(); //返回pFirst
Account* Next(); //返回pNext
static int NoAccount(); //返回numAccount
void changeTel(char*); //更改telNum
void changePost(int); //更改postNum
void changePassword(int); //更改password
virtual void PrintDW(int,char*); //虚函数 打印清单
virtual void PrintI(int,char*); //虚函数 打印利息单
void delAcc(int); //删除一个结点
virtual void Deposit(float); //虚函数 存款
virtual void Withdrawal(float); //虚函数 取款
protected:
static Account* pFirst;
Account* pNext;
static int numAccount;
int accId;
int postNum;
char* telNum;
int password;
float balance;
};

class companyAccount : public Account
{
public:
companyAccount(int,float,float,char*,char*,char*,int,char*,int,int);
char* backName(); //返回name
char* backCompanyID(); //返回companyID
char* backTaxID(); //返回taxID
int backLoanMonths(); ......
float backLoanBalance();
virtual void PrintDW(char*);
virtual void PrintI(char*);
void PrintL(char*);
virtual void Deposit(float);
virtual void Withdrawal(float);
void Loan(int,float);
void RepayLoan();
protected:
char* name;
char* companyID;
char* taxID;
int loanMonths;
float loanBalance;
};

enum AccClass {fixDateDeposit,demondDeposit};

class personalAccount : public Account
{
public:
personalAccount(int,float,char*,char*,AccClass,int,char*,int,int);
char* backName();
char* backPersonID();
int backDepositMonths();
int backFixAccNum();
int backDemondAccNum();
virtual void PrintDW(char*);
virtual void PrintI(char*);
virtual void Deposit(float);
virtual void Withdrawal(int,float,int);
protected:
static int fixAccNum;
static int demondAccNum;
char* name;
char* personID;
AccClass accountClass;
int depositMonths;
};
Jinhao 2004-08-11
  • 打赏
  • 举报
回复
personalAccount::First();中First()、Next()、AccountId()分别是父类Account中定义的返回头指针、下一结点指针、帐号的函数

for(personalAccount* pS=personalAccount::First();pS->Next();pS=pS->Next())
^^^^^^^^^^^^^
pS=pS->Next(),//convert from 'class Account *' to 'class personalAccount *'
所以错了,改为
for(personalAccount* pS=personalAccount::First();pS->Next();pS= static_cast<B*>(pS->Next()))
这样的转换只能适用这里的代码,或者根本就是个错的转换!
RookieStar 2004-08-11
  • 打赏
  • 举报
回复
没用多态吗?最好用多态,记得用virtual。

personalAccount::First()可以返回一个Acount*,用到向上转型。

信息还不够多,不足以帮你解决问题。

64,281

社区成员

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

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