has-a的关系,没有复制构造函数,这么初始化可以么StackSeq::StackSeq (IStack const & stack )

疯魔症 2009-03-23 11:48:24
两个类StackSeq和IStack,IStack没有复制构造函数,
StackSeq::StackSeq (IStack const & stack )
: _iCur (0), _stack (stack) // init reference{}。
个人觉得有问题
一本书上看到的,我感觉不对,但编译没错,可能使用的都是基本数据类型,没有使用动态变量
所以可以编译,但是不严谨。
#if !defined (STACK_H)
#define STACK_H
// (c) Bartosz Milewski 2000

const int maxStack = 16;

class IStack
{
friend class StackSeq; // give it access to private members
public:
IStack (): _top (0) {}
void Push (int i);
int Pop ();
private:
int _arr [maxStack];
int _top;
};

class StackSeq
{
public:
StackSeq (IStack const & stack);
bool AtEnd () const; // are we done yet?
void Advance (); // move to next item
int GetNum ()const; // retrieve current item
private:
IStack const & _stack; // reference to stack
int _iCur; // current index into stack
};

#endif

StackSeq::StackSeq (IStack const & stack )
: _iCur (0), _stack (stack) // init reference
{}
...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯魔症 2009-03-25
  • 打赏
  • 举报
回复
我也不喜欢这种方式 IStack const &,常量引用const IStack &
[Quote=引用 5 楼 arong1234 的回复:]
无论哪种类型在这都用(),但是对于构造新对象的情况,你的构造函数必须能够支持这样初始化
也就是说,如果_stack不是一个引用而是一个普通对象,那么它的构造函数必须支持接收一个const IStack&类型的对象
不是很喜欢IStack const&这种表示方法

引用 3 楼 zwb0540822 的回复:
恩 谢楼上。如果为非引用的,初始化是调用构造函数么。
StackSeq::StackSeq (IStack const & stack )
: _iCur (0), _stack (stack) //…
[/Quote]
疯魔症 2009-03-25
  • 打赏
  • 举报
回复
一人10分结了
arong1234 2009-03-23
  • 打赏
  • 举报
回复
无论哪种类型在这都用(),但是对于构造新对象的情况,你的构造函数必须能够支持这样初始化
也就是说,如果_stack不是一个引用而是一个普通对象,那么它的构造函数必须支持接收一个const IStack&类型的对象
不是很喜欢IStack const&这种表示方法

[Quote=引用 3 楼 zwb0540822 的回复:]
恩 谢楼上。如果为非引用的,初始化是调用构造函数么。
StackSeq::StackSeq (IStack const & stack )
: _iCur (0), _stack (stack) // init reference
{}
我的理解是,类的构造函数的定义,调用数据的构造函数,像这段: _iCur (0), _stack (stack)
基本数据类型用()就可以了。
[/Quote]
疯魔症 2009-03-23
  • 打赏
  • 举报
回复
不是自己写,书上的代码,看了觉得有问题。
[Quote=引用 2 楼 iambic 的回复:]
#endif要放到最后面。
你这个东西何必自己写?为什么不直接用STL?
Stack就是个先进先出的东西,来个StackSeq又有什么意思呢?
[/Quote]
疯魔症 2009-03-23
  • 打赏
  • 举报
回复
恩 谢楼上。如果为非引用的,初始化是调用构造函数么。
StackSeq::StackSeq (IStack const & stack )
: _iCur (0), _stack (stack) // init reference
{}
我的理解是,类的构造函数的定义,调用数据的构造函数,像这段: _iCur (0), _stack (stack)
基本数据类型用()就可以了。
iambic 2009-03-23
  • 打赏
  • 举报
回复
#endif要放到最后面。
你这个东西何必自己写?为什么不直接用STL?
Stack就是个先进先出的东西,来个StackSeq又有什么意思呢?
arong1234 2009-03-23
  • 打赏
  • 举报
回复
_stack根本就是一个引用,为什么需要“拷贝构造函数”?拷贝构造函数只有在构建新对象时才需要,你这个根本没有创造出新对象,不会调用任何构造函数

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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