好久没用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 singleton
static 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…

解决方式当然非常easy. 參考 http://yuanzhifei89.iteye.com/blog/2020082

把代码放到以下的代码块中:

#ifndef _Group_H
#define _Group_H
//防止嵌套include导致编译死循环
#endif

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

总体代码

#ifndef _Group_H
#define _Group_H
//防止嵌套include导致编译死循环 #include <iostream>
#include <vector>
//#include "User.h"
using namespace std;
class User;//这里是C++类的前向声明。没实用include“User.h”
//编译到一块之后User*自然指向了User class
//事实上非常easy, 是先编译了Group又编译了User, 最后编译了WechatServer, 依照字母顺序
//所以User也能够前向声明一个class WechatServer
class 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的延伸

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

& 和 * : 地址和指针

&作用在一个对象和基本类型签名, 是取这个对象/类型的地址, 事实上这个地址就是指针用到的, 所以能够给指针赋值:

    User user;//真正赋值到内存了
user.getId(); User* uptr = &user;//地址就是指针
uptr->getId();

另外&用在函数中还有传递引用的左右,

int p = 8;
test(int &i){
i = 88;
}
test(p);// p = 88

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 myself
if(myfriend->getId() != user->getId() && friendCount < 5){
cout << "adding friend : "<< myfriend->getId()<<endl;
user->addFriend(myfriend);
friendCount ++;
}
}
}

6.const

相似java中的final, 不可变

參考http://cnmtjp.blog.51cto.com/204390/35976

void f(const int i) { .........}
//对传入的參数进行类型检查。不匹配进行提示
void f(const int i) { i=10;//error! }
//假设在函数体内改动了i,编译器就会报错

const 函数

修饰类成员函数
void func() const; // const成员函数中不同意对数据成员进行改动。假设改动,编译器将报错。假设某成员函数不须要对数据成员进行改动,最好将其声明为const 成员函数,这将大大提高程序的健壮性。 const 为函数重载提供了一个參考
class A
{
public:
void func(); // [1]:一个函数
void func() const; // [2]:上一个函数[1]的重载
……
};
A a(10);
a.func(); // 调用函数[1]
const A b(100); //const的变量调用const的函数
b.func(); // 调用函数[2]

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

IDE :QTCreator 2.4.1

[积累]C++复习 海大2014硕士生面试题微信系统总结的更多相关文章

  1. 数据结构《21》----2014 WAP 初试题----Immutable queue

    2014 WAP初试题----实现一个不可变的队列: 看似很简单..实则,不同的版本效率的差距可能是巨大的..甚至难以想象.. 之前用STL库的queue进行了对比,差别非常大.. 用上一篇文章的im ...

  2. 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列

    引言:题目具体描述记不大清了,大概是:Linux平台,利用线程调度的随机性和sleep的不准确性,生成一个各位均不相同的字符数组的伪随机序列.不得使用任何库函数.(这句记得清楚,当时在想线程库算不算, ...

  3. 考研计算机复试(广东工业大学C语言复试2014~2017笔试题)(精华题选)

    1.C语言中,全局变量的存储类别是() A.extern B.void C.int   D.static 2.静态变量: (1)static 外部变量===>在函数外定义,只能在本文件中使用 ( ...

  4. 微软2014校招笔试题-String reorder

    Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB Description For this question, your pro ...

  5. C 2014年笔试题

    1.指出程序中的错误,说明原因并修正 int *p,*q; p=malloc(sizeof(int)*20); q=malloc(sizeof(int)*10); … q=p; … free(p); ...

  6. MyEclipse 2014专业版的破解--Windows系统的软件安装

    一.破解前的准备 MyEclipse2014破解包: 您可以到计算机相关专业所用软件---百度云链接下载中找到链接地址进行下载. 二.破解步骤 1.打开破解文件资源包 2.执行run.bat 3.输入 ...

  7. 2014.10.1 Cmd更改系统时间

    Process p = new Process(); //Process类有一个StartInfo属性 //设定程序名 p.StartInfo.FileName = "cmd.exe&quo ...

  8. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. php面试题10(复习)

    php面试题10(复习) 一.总结 复习 二.php面试题10 21.谈谈 asp,php,jsp 的优缺点(1 分)(asp要钱,jsp学习成本大)答:ASP 全名 Active Server Pa ...

随机推荐

  1. VirtualBox中的Ubuntu没有权限访问共享文件夹/media/sf_bak

    之前已经搞定可以自动共享文件夹了,但是现在发现无法去访问,非root用户下,使用“ls /media/sf_bak”提示没有权限,当然如果切换到root,是可以的. [解决过程]1.把普通用户名加入到 ...

  2. Android编程心得-设计一个可重用的自定义Dialog

            我们在实际开发过程中,会遇到一个问题,我们的Dialog如果使用一般的方法进行设置调用出来,会有很多的重复代码,如何将Dialog按照自己的思路设计呢,并让其可重用呢,下面我来介绍一下 ...

  3. Image控件

    前台代码: <asp:Image ID="Image1" runat="server" /> 后台代码; protected void Page_L ...

  4. java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作

    项目源码下载:http://download.csdn.net/detail/liangrui1988/6720047 效果图: 相关代码: test1 package com.mail; impor ...

  5. Qt Charts的简单安装与使用

    http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...

  6. 转:c语言EOF是什么?(及getchar()和putchar用法)

    我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...

  7. PB数据管道

    数据管道提供了一种不同数据库之间传递数据和(或)表结构的方法. 数据管道对象 要完毕数据管道的功能须要提供例如以下内容: 须要数据源和目标数据库,并可以和这两个数据库正常联接 须要源数据库中的哪些表: ...

  8. cloudflare的新waf,用Lua实现的

    我们使用nginx贯穿了我们的网络,做前线web服务,代理,流量过滤.在某些情况下,我们已经扩充了nginx上我们自己的模块的核心C代码,但近期我们做了一个重大举措,与nginx结合使用lua 差点儿 ...

  9. Swift语言Storyboard教程:第一部分

    更新记录: 该Storyboard教程由Caroline Begbie更新iOS 8和Swift相关内容.原文作者为教程编纂组的成员Matthijs Hollemans. 2014/12/10更新:  ...

  10. 基于JSP+SERVLET的新闻发布系统(二)

    接下来讲解的是通过AJAX验证用户名是否已经添加 用户名: <input type="text" name="userName" id="use ...