r*******m 发帖数: 109 | 1 If you define any constructor, the compiler will not synthesize default one
for you. But if you don't define, it will. |
|
G****A 发帖数: 4160 | 2 class A{
public:
A(int) {...}
private:
A() {;}
};
class B{
public:
B(int n, A& a): num_(n),ref2A_(a) {...}
private:
cont int num_;
cont A& ref2A_;
B():num_(0),ref2A_(A()) {;}
};
1.in class B, 因为ref2A_是reference,必须initialization,所以我这里用A()作为
一个default input(???有没有别的方式???)。
2.in class A, 需要把A()放在private(不允许被外部调用)。
有什么好的办法解决1和2的矛盾?friend好像可以,但是这两个class逻辑上没有
connection,所以声明friend好像不合适 |
|
t****t 发帖数: 6806 | 3 first of all, if you default init B, you plan to put the const reference to
a temporary object? do you plan to change it at all? what's the point? |
|
a*****i 发帖数: 268 | 4 You can define a static A object and reference it. |
|
G****A 发帖数: 4160 | 5 你的意思是?
class A
{
...
};
static A static_A = A();
然后
class B{
...
private:
...
B():num_(0),ref2A_(static_A) {;}
}; |
|
t****t 发帖数: 6806 | 6 if B::B() is never called, you don't have to provide the definition.
谓。 |
|
t****t 发帖数: 6806 | 7 oh, if you want to provide an empty function, don't write a semicolon in it.
it's neither good nor legal. |
|
G****A 发帖数: 4160 | 8 这里B:B()好像必须要define的巴...毕竟ref2A_是const reference类型 |
|
|
|
P********e 发帖数: 2610 | 11 这里很多设计大牛,我任砖一下。从OOD角度,设计一个类const reference to anther
class, 就是说object of B存在前提必须有个object of A. 所以B不应该有defualt
ctor。如果只是B用到了A, 可以用pointer to A就好了,一般不用引用。 |
|
G****A 发帖数: 4160 | 12 刚才事了一下,用point好像可以绕过这个问题。
anther |
|
P********e 发帖数: 2610 | 13 pointer的意思就是B的存在不完全以A为前提。用之前只要查一下这个pointer是不是为
0就好了。 |
|
|
y**b 发帖数: 10166 | 15 最后一个static想干什么呢?
第一次多调用拷贝构造函数,以后每次多调用copy assignment. |
|
w********r 发帖数: 1971 | 16 建议反汇编看看,怀疑(A*)(&*this),中*this先生成临时对象调用拷贝构造函数,然后
把临时对象地址转换成基类指针,纯猜测,如果系统自动优化的话,应该是等价于(A*)
this的. |
|
d****n 发帖数: 1637 | 17 define all parameters in a struct( I googled it.)
//B.h
typedef struct {
int p1,p2,p3,p4,p5.....
} param;
class B{
B(param){
//change param.p1
// change param.p2
// etc.
}
}
//in D.h
#include "B.h"
class D : public B{
D(/*D's private params*/):B( param b){}
};
pros and cons? |
|
|
|
t****t 发帖数: 6806 | 20 i guess you are not supposed to change B's ctor, and they are probably not
all int.
the interviewer wanted you to answer templated constructor. but that's an
old question; new answer should be c++11's Inherited Constructor, that is
new [12.9] or N2540. Just write in D's declaration:
using B::B;
That's easy enough. |
|
|
t****t 发帖数: 6806 | 22 unfortunately, gcc still doesn't support it yet. waiting for 4.8... |
|
X****r 发帖数: 3557 | 23 我指的是下面那个构造函数里的Test(this);
楼主应该不是想要创建一个不用的临时对象吧。 |
|
l********a 发帖数: 1154 | 24 update:
去其他论坛问了一下,不到5分钟有人指出一个问题,好像解决了
就是把children不要定义为 list《Test》而是定义为list《Test*》,
然后构造函数里面给当前对象push_back时候使用new Test(this)就行了
暂时测试多层结构还有些问题,可能是代码改来改去改乱了,但是第一层的children利
用指针获得-〉parent是正确的 |
|
b***i 发帖数: 3043 | 25 看Synopsis
template class shared_ptr {
public:
typedef T element_type;
shared_ptr(); // never throws
template explicit shared_ptr(Y * p);
~shared_ptr(); // never throws
Effects:
If *this is empty, or shares ownership with another shared_ptr instance (use
_count() > 1), there are no side effects.
Otherwise, if *this owns a pointer p and a deleter d, d(p) is called.
Otherwise, *this owns a pointer p, and delete p is called.
可见,你
boost::shared_ptr create(){... 阅读全帖 |
|
|
t****t 发帖数: 6806 | 27 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的
, 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到
COM就是解决这类问题, 废话的程度还不算太高.
的? |
|
d******i 发帖数: 7160 | 28 FT。作者就是说:
"只换dll不改h的理想境界在引入com之前做不到"?
这个有什么说头呢?
我老可是抱着读圣书的态度细读的,看来不能希望太高:( |
|
|
d******i 发帖数: 7160 | 30 haha,看啥有用?
与其乱跟风,不如静下心看点说原理的东西。
不过老了点是真的。 |
|
|
|
|
|
x****u 发帖数: 44466 | 35 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。 |
|
x****u 发帖数: 44466 | 36 简单点说,就是由于C++的天然缺陷,大多数语言特性在跨编译器时行为都不可预测。
COM就是为了在不破坏C++语法的基础上将尽可能多的现代语言特性引入。没有必要机械
的理解任何COM的特性,从需求出发即可。
的? |
|
x****u 发帖数: 44466 | 37 关于COM比MSDN写的好的书,似乎真没有。很多所谓经典也在胡说八道。 |
|
|
x****u 发帖数: 44466 | 39 现在看什么不浪费时间呢?
觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细
读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。 |
|
s***o 发帖数: 2191 | 40 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了 |
|
x****u 发帖数: 44466 | 41 还真没关系。COM这一套搬到什么指令集上都能用,这不ARM上面的Windows RT也是基于
COM的。 |
|
t****t 发帖数: 6806 | 42 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专
门花时间学.
作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么?
我没学过COM也总结得出来. |
|
x****u 发帖数: 44466 | 43 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相
当的不可靠。
比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。
? |
|
|
x****u 发帖数: 44466 | 45 简单例子,B里面new一个对象传给A后不管,让A释放掉。
是相 |
|
|
x****u 发帖数: 44466 | 47 因为DLL B里面创建的对象,DLL A也许无法正确释放。 |
|
t****t 发帖数: 6806 | 48 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用
同样的libc(比如动态链接的libc)的话. |
|
x****u 发帖数: 44466 | 49 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是
问题的源泉。
而且对于私有代码大多数时候不可能要求使用同样的C库。 |
|
t****t 发帖数: 6806 | 50 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个
问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h
无关. |
|