梦想无论怎样模糊,总潜伏在我们心底,使我们的心境永远得不到

好久没用C++了,正好同学有个面试题,于是就帮忙看了一下.虽然对C++的知识了解不少, 但是长期被Java浸淫, 发现这个简单的程序却也写着也不是那么顺手.好在最后还是搞定了,下面分析一下,题目如下, 小弟不才, 可能有错误的地方 ,还请大神指正

把这个题目分成了Group, User ,WechatServer三个类, 具体就是一点简单的操作, 后面将附上源码.这里记录一下自己写时候遇到问题的一些总结:

1.实现单例, 这和Java差距还是有些的. WechatServer需要一个单例, 这样可以保持User列表,和group列表, 代码实现如下:

class WechatServer{private:WechatServer(){}static WechatServer* m_Instance;vector<User*> mUsers;vector<Group*> mGroups;public://need use singletonstatic WechatServer* GetInstance()//这里使用了饿汉式{if(!m_Instance)m_Instance = new WechatServer();return m_Instance;}User* findUserById(int id); //这些函数在WechatServer.cpp中实现, 当然其实可以在任何一个include了WechatServer.h的cpp文件中实现 .cpp文件不过是为了让代码更加模块化vector<User*> getUsers();void createGroup(vector<User*> users , int creatorId);void addUser(User* user);};

2.互相include问题, 这里遇到两个问题

A 重复编译问题, 编译的时候, User 和 Group互相include了, 开始的时候,发现编译器编译到这里死循环了,也好理解 编译Group的时候由于include了User就去先编译User,但是编译User的时候有发现include了Group也是去编译Group… 解决方案当然很简单. 参考 把代码放到下面的代码块中:

B 这时候编译Group的时候发现找不到User类了, 原因先编译Group的时候,User类没有编译处理, 所以做了一个前置声明解决问题 整体代码

;Group{public:int mGroupId,mCreatorId;vector<User*> mMembers;Group(int groupId , int creatorId){mGroupId = groupId;mCreatorId = creatorId;}void addMembers(vector<User*> users){for (vector<User*>::size_type i = 0; i != users.size(); ++i){mMembers.push_back(users[i]);}}};#endif

3. C++特有符号 符号:: 可以认为限定搜索范围, 如果想在User.cpp中实现User.h中声明的getId()函数,或者使用User.h声明的mFriends私有成员变量必须这么写: 没有User::会报错.同时, 其实在main.cpp中实现这个函数也没有任何问题 .h真正包含了类,cpp不过是 他们的实现而已, 里面的内容可以写在任何地方 “` User.h: int mWeChatId;

User.cpp:int **User**::getId(){return **User**::mWechatId} “`**符号”.”** : 这是C++的对象调用函数使用的, 也说明类不过是struct的延伸

符号 -> : 指针调用函数使用

4.堆和栈 在这个问题中new了八个User, 开始把User放到了栈中, 结果他们的地址都是一个.后来放到堆中解决. //User user(1000 + i, 84508241+ i , phone , email); //cout<<&user; 这样放到了栈中, 这里虽然循环了八次, 但是打印出来的地址其实都是同一个 //需要把user放到堆中, 这样才可以生成八个User User* user = new User(1000 + i, 84508241+ i , phone , email); cout << user; wechatServer->addUser(user);

5.vector的遍历

void addFreind(User* user ,vector<User*> userlist){int friendCount = 0;for (vector<User*>::size_type i = 0; i != userlist.size(); ++i){User* myfriend = userlist[i];//can not add myselfif(myfriend->getId() != user->getId() && friendCount < 5){cout << “adding friend : “<< myfriend->getId()<<endl;user->addFriend(myfriend);friendCount ++;}}}

项目git地址 https://git.oschina.net/sfshine/CppDemoWechat.git IDE :QTCreator 2.4.1

,积极思考造成积极人生,消极思考造成消极人生。

梦想无论怎样模糊,总潜伏在我们心底,使我们的心境永远得不到

相关文章:

你感兴趣的文章:

标签云: