代码的改动对编译C++的问题

excited_lamb 2010-09-13 12:18:10

class Shape
{
public:
Shape() { cout << "Shape()\n"; }
~Shape() { cout << "~Shape()\n"; }
virtual void draw() = 0;
};

class Circle : public Shape
{
public:
virtual void draw()
{
cout << "Circle\n";
}
};

class Square : public Shape
{
public:
virtual void draw()
{
cout << "Square\n";
}
};

shared_ptr<Shape> GetShape(const string& t)
{
Shape* p = 0;
if(t == "Circle")
p = new Circle;
else if(t == "Square")
p = new Square;

return shared_ptr<Shape>(p);
}


1, 我改动了Shape类,会导致重新编译Circle类和Square类?
2, 我改动Circle类或Square类,会导致Shape类重新编译吗?
3, Shape类或Circle类或Square类的改动会导致函数GetShape的重新编译吗?
4,把以上这些类函数分开放在.h.cpp中,以上3问题结果是否不一样?

最近在看设计模式的相关书籍,上面老是提到这样这样可以防止相关类的重新编译部署,,我对这些‘改动’引起‘XX重新编译’这些概念不熟悉,不知道是不是缺乏了某些知识,这方面要看什么书,在哪里可以找到这方面资料呢?
...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 excited_lamb 的回复:]
那对.h的改变,对于包含它的.h文件呢????
[/Quote]

看你怎么修改了。如果只是修改了成员函数里面的实现的话,那么只需要对相应的.cpp文件进行重新编译。
excited_lamb 2010-09-13
  • 打赏
  • 举报
回复
那对.h的改变,对于包含它的.h文件呢????
冻结 2010-09-13
  • 打赏
  • 举报
回复
对.h的改变,包含它的cpp文件都要重新编译。
对cpp的改变,只影响当前cpp的重新编译。

因为编译是对.c,.cpp文件而言。

mengde007 2010-09-13
  • 打赏
  • 举报
回复
改动之后是否影响内存布局,如果是:重新编译吧,
excited_lamb 2010-09-13
  • 打赏
  • 举报
回复
不知道可否指出哪里有这方面资料啊?
gules 2010-09-13
  • 打赏
  • 举报
回复
1、“我改动了Shape类,会导致重新编译Circle类和Square类?”是的,对基类定义的改动将导致派生类的重编译。
2、“我改动Circle类或Square类,会导致Shape类重新编译吗?”不会,对派生类的改动不会导致基类重编译。
3、“Shape类或Circle类或Square类的改动会导致函数GetShape的重新编译吗?”是的,GetShape函数定义使用了这三个类的定义(shared_ptr<Shape>需要Shape的定义,两个new操作需要Circle类和Square类的定义)
4、“把以上这些类函数分开放在.h.cpp中,以上3问题结果是否不一样?”如上三点。总的原则是,一个CPP文件使用了其它CPP文件中类型和对象的定义,那么改动后者的定义将导致前者的重编译(即1楼所说的是否关乎内存布局);如果前者CPP文件中只是引用了后者CPP文件中的类型和对象,那么后者的改动不会导致前者重编译。

以上是我个人理解,有不对之处请指正,非常感谢!

64,651

社区成员

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

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