MySpace

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  18 随笔 :: 2 文章 :: 10 评论 :: 0 Trackbacks

#

     摘要: 消除"对于类成员的引用所产生的二义"是不考虑访问权限,可以归结为:改变一个类成员的访问权限不应改变程序的含义。  阅读全文
posted @ 2008-06-05 09:58 yang-chunlei 阅读(92) | 评论 (0)编辑 收藏

     摘要: 当将一个派生类强制转换成基类类型的时候,转换方式不一样会产生不一样的效果。例如该代码:static_cast(*this) ;


base 是基类,这句代码是将当前对象强制转化为积累类型的对象的引用,这样的话不会再次调用基类的构造函数。若转换成基类对象那就要调用基类的构造函数并创建出新的对象来了。
  阅读全文
posted @ 2008-06-04 15:12 yang-chunlei 阅读(247) | 评论 (0)编辑 收藏

     摘要: 在一个函数中有个参数是 CONST 类型,例如: string & max(string s1,string s2) ,那么我调用的时候有可能会这样写:max("abc","edf"); 然后编译,出错。提示为 无法将 CONST 类型转换为 非CONST 类型。那是因为编译器在接收到"abc"的时候会生成一个临时变量,然后将这个临时变量传入到 max 函数中。但是这个临时变量是 CONST 类型的,与该函数的定义不一致,所以会在编译时抛出类型不一致的错误。  阅读全文
posted @ 2008-06-04 11:57 yang-chunlei 阅读(305) | 评论 (2)编辑 收藏

     摘要: 刚刚在 LINUX 下用 KDEVLOP 逐步调试了一下,当 A 类的析构函数设置为虚函数的时候没有出现 VC 下那样的错误提示,输出也正确。只是我在 A 类的析构函数中设置的断点是无效的,就是说该析构函数中语句是可以执行的但是此处的断点不能让程序在此处停下来。看来可能是在此种问题上 VC 在 DEBUG时是做了一些并不是非常准确的但可能是安全性方面的提示。
  阅读全文
posted @ 2008-06-04 10:30 yang-chunlei 阅读(281) | 评论 (0)编辑 收藏

     摘要: 摘自 CSDN感觉这篇文章写的不错,看了之后很有收获。本来想自己总结一下发布出来,但还是偷了个懒,把别人的东西拷贝过来了。   共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,...  阅读全文
posted @ 2008-06-03 11:15 yang-chunlei 阅读(214) | 评论 (0)编辑 收藏

    共享内存中我们可以放置数据来供不同的进程去访问、读写。但是不是任何数据都可以放进去呢,答案是否定的。最起码抽象类是不能放进去的,具体理由从书上摘录了一段:在C++中, new运算符可用来在共享内存中初始化C++对象。这一特性对concrete class(具体类)[Bja00]来说是可行的,因为每一个concrete class都包含“提供这一支持所需的全部操作”。concrete class中的所有方法(method)都是非虚方法(nonvirtual);也就是说,它们是被直接调用的,而不是通过函数指针间接调用。很多ACE wrapper facade都是concrete type(具体类型)。

相反,abstract type(抽象类型)包含虚方法,如果将其置于共享内存中,则在编写程序时将很棘手。通常,虚方法是间接调用的,它要借助一个“位于对象内存中”的函数指针表(vtable)。在每一个映射了共享内存的进程中,此共享内存区可能位于不同的虚拟内存区域(location)[BC94、Jor91]。而且,C++编译器/链接器不一定会将vtable放在各个进程的相同地址中。因此,vtable及其指向的函数可能会被映射到各个进程中的不同虚拟地址中,因而必定会在运行时产生问题。

看过这段解释之后会明白很多。

posted @ 2008-06-02 11:51 yang-chunlei 阅读(346) | 评论 (0)编辑 收藏

写了一段代码是这样的

enum day
{
 Sunday, Monday, Tuesday,
 Wednesday, Thursday, Friday,
 Saturday, not_a_day
};

day* operator++(day *d)
{
 //d = d + 1;
 *d = (day)(*d + 1);
 return d;
}

编译出现了错误:error C2803: “operator ++”必须至少有一个类类型的形参

难道运算符的重载参数不能为指针,查阅了MSDN 得到如下结果

-----------------------------------------------------------------------------------------------------------------

错误消息
“operator operator”必须至少有一个类类型的形参


重载运算符缺少类类型的参数。

您需要通过引用(不是使用指针,而是使用引用)或值至少传递一个参数,从而能够编写“a < b”(a 和 b 均为类 A 类型)。

如果两个参数都是指针,结果将是指针地址的纯比较,并且将不使用用户定义的转换。

下面的示例生成 C2803:


// C2803.cpp
// compile with: /c
class A{};
bool operator< (const A *left, const A *right);   // C2803
// try the following line instead
// bool operator< (const A& left, const A& right);

posted @ 2008-05-29 15:57 yang-chunlei 阅读(297) | 评论 (0)编辑 收藏

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下:
ostringstream::ostringstream(string str);

#include <iostream
#include <sstream
#include <string
using namespace std; 
int main()  

ostringstream ostr; 
//ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长 
ostr.put('d'); 
ostr.put('e'); 
ostr<<"fg"; 
 
string gstr = ostr.str(); 
cout<<gstr; 
system("pause"); 
}

結果為:defg;



总之,使用 ostringstream  就像是在 WORD 中按下了 “Insert ” 键,对一段话从头开始修改,也就是使用“插入”模式来从头修改一个字符串。


posted @ 2008-05-29 14:15 yang-chunlei 阅读(2098) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2