免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1376 | 回复: 4
打印 上一主题 下一主题

类定义的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-29 03:49 |只看该作者 |倒序浏览
我在分析Linux下的一个项目时碰到一个问题,恳请大家指点。头文件(DgAddressBase.h)的内容如下:

#ifndef DGADDRESSBASE_H
#define DGADDRESSBASE_H
#include <iostream>;

using namespace std;
class DgAddressBase
{
public:
   virtual ~DgAddressBase (void);

protected:
    DgAddressBase (void) {}
   
   /*纯虚函数*/
    virtual ostream& writeTo (ostream& stream) const = 0;
  
   /*友元*/
   friend ostream& operator<< (ostream& stream, const DgAddressBase& add);
};

inline ostream& operator<< (ostream& stream, const DgAddressBase& add)
{
return add.writeTo(stream);
}

#endif

我将该文件包含在VC++ 6.0工程中,在和一个测试程序(*.cpp)编译时报错:
error C2248: cannot access protected member declared in class 'DgAddressBase'.
我想,以上代码在g++编译器下肯定是能通过的,而根据<<C++ Primer>;>;上的讲解,'<<'运算符重载是不允许调用writeTo纯虚函数的.
我想请教各位高手,这是不是因为编译器的不同而出现的问题? 怎样才能在VC下定义和上面等效的类呢? 是不是直接将运算符重载的那一段去除就可以了?

论坛徽章:
0
2 [报告]
发表于 2005-01-29 09:20 |只看该作者

类定义的问题

>;>;我想,以上代码在g++编译器下肯定是能通过的
如果你直接定义DgAddressBase 的对象的话,在g++下是肯定不能通过编译的,这个类的存在是为了被继承

论坛徽章:
0
3 [报告]
发表于 2005-01-29 10:54 |只看该作者

类定义的问题

std名字空间内应该还存在一个建立DgAddressBase对象的工厂类,protected表示仅在std名字空间,DgAddressBase的子类才能访问该构造函数

论坛徽章:
0
4 [报告]
发表于 2005-01-29 13:14 |只看该作者

类定义的问题

没错,DgAddressBase就是为了继承的,可是我就不清楚,为什么g++编译通过的代码在VC上出错?是类定义的问题还是编译器的问题?可能我上面没说清楚,全部代码如下:

1.DgAddressBase.h文件
#ifndef DGADRESSBASE_H
#define DGADRESSBASE_H

#include <iostream>;
using namespace std;

class DgAddressBase
{
public:
        virtual ~DgAddressBase (void);

protected:
           DgAddressBase (void) {}
           //纯虚函数
           virtual ostream& writeTo(ostream& stream) const = 0;

//"<<"操作符重载
friend ostream& operator<< (ostream& stream,  DgAddressBase& add);

//测试函数
friend ostream& f(ostream& stream,  DgAddressBase& add);
};

// 为何在VC中编译失败? 信息如下:
// error C2248: 'writeTo' : cannot access protected member declared in class 'DgAddressBase'
//                    ... : see declaration of 'writeTo'
inline ostream& operator<< (ostream& stream, DgAddressBase& add)
{
        return add.writeTo(stream);
}

//编译成功
inline ostream& f(ostream& stream, DgAddressBase& add)
{
        return add.writeTo(stream);
}

#endif

2.DgAddressBase.cpp文件
#include "DgAddressBase.h"
DgAddressBase::~DgAddressBase (void)
{
        //析构函数
}
高手解释一下吧?

论坛徽章:
0
5 [报告]
发表于 2005-06-17 18:31 |只看该作者

类定义的问题

知道了,是VC编译器的问题,打上SP6后全部搞定!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP