读书人

最近的一点小困惑.关于类的设计的.解决

发布时间: 2012-03-18 13:55:39 作者: rapoo

最近的一点小困惑.....关于类的设计的...
就是关于一些类的设计与怎么安排成员函数和私有的数据成员...
举个小例子吧:
这是一个关于迷宫的...函数的具体实现就不贴出来了,因为那不是要问的重点..呵呵~~
class Position{
public:
Position():x(0),y(0){};
friend class Maze;//这里合理么?我感觉不是很合理,但不止到怎么改??
private:
int x;
int y;
};

class Maze{
public:
Maze();
void readmap();
void printmap();
bool findpath(stack <Position> &);
void printpath(stack <Position> &);
stack <Position> path;
/*本来应该是private,但是private的话下面的程 序报错,说不能访问private成员...是不是stack <Position> path本来就不该放到Maze类里面,或者应该???*/
private:
int maze[size][size];
};


Maze::Maze(){}
void Maze::readmap(){....}
void Maze::printmap(){...}
bool Maze::findpath(stack <Position> & path){}
void Maze::printpath(stack <Position> & path){}


int main(){
Maze maze;
stack <Position> sta = maze.path;
/*如果把上面的stack <Position> path改为private的,这里报错...或许stack <Position> sta = maze.path应该改!!!!????*/
maze.readmap();
maze.printmap();
maze.findpath(sta);
maze.printpath(sta);
return 0;
}



[解决办法]
你把它放在private里当然在外面不能访问了,
你如果实在想把它放在private里,
而且在外面还可以访问的话,
可以做一个公有函数,
来返回它,
也就是在你的类里面写:

private:
stack <Position> path;

public:
stack <Position> GetPath()
{
return path;
}

在外面调用的时候,
maze.path
改为
maze.GetPath();
[解决办法]
个人观点:
friend class Maze ;没有必要,写两个内联函数访问之 就可以了,

stack <Position> path;看起来好想 没有必要存在于Maze的类中。
[解决办法]
首先,我没有完全看懂stack <Position> path的用途,也说不上该不该放在Maze内部。如果它在逻辑上应该是迷宫的一部分,离了它,迷宫就不称为迷宫,那么它就应该放在迷宫这个类的实现中,这是没有问题的。

但外界如何访问,前面朋友都说了,应该提供公有的访问函数,一般都是这么做的。比如,你的程序中,如果外界需要访问x和y,那么Position类应该有getX,getY等方法。这里完全没有必要搞一个friend。

而对于那个Stack,如果外界需要,也可以提供一些访问方法,但一般不应该是整个Stack直接用引用返回出去,最好还是提供一些getTop/push之类的函数,传递一下对Stack的调用比较好。
但我还是更觉得这个Stack只是Maze类的实现细节,外界根本不需要也不应该访问,连公共访问函数都不需要有。我很奇怪你的findpath/printpath两个成员函数为什么还要有那个参数?别用参数,而是让它们直接访问自己类的成员变量不好么?
[解决办法]
把这个问题再详细的说说吧,呵呵。

(1)如果你在对象创建之后,除了读取之外,确实还需要设置x和y,也就是说需要更改(mutable),则就增加两个函数,setX,setY,也没什么。但一般对于短小的数据类型,immutable的要比mutable的用起来更安全一些。如何取舍,看你的具体情况了。

(2)像这种短小而又简单的纯数值类型,再退一步,其实用纯粹POD类型也可以的,即类似C的struct,全部成员(一共也就两个int)都是public。这在实践中也是常常有的。但这样的类,要始终保持它的简单,一量它需要变得复杂了,这样做就不合适了。

(3)另外,对于你的情况,你试着用用std::pair模板也可以的,呵呵。

读书人网 >C++

热点推荐