免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: gosoft
打印 上一主题 下一主题

[C++] 一个C++ string类的问题。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-12-12 09:30 |只看该作者
你看一下这个代码,就知道为啥会引起歧义了.

  1. class test
  2. {
  3. public:
  4.         operator char*()
  5.         {
  6.                 static char sz[]="123";
  7.                 return sz;
  8.         }
  9. };
  10. int main(int argc, char* argv[])
  11. {
  12.         test p;
  13.         p[2]='c';
  14.         return 0;
  15. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2007-12-12 10:11 |只看该作者
class test
{
public:
        operator char*()
        {
                static char sz[]="123";
                return sz;
        }
};
int main(int argc, char* argv[])
{
        test p;
        p[2]='c';
        printf("%s\n", (char*)p);
        return 0;
}

没看明白在哪里起义了

论坛徽章:
0
13 [报告]
发表于 2007-12-12 10:12 |只看该作者
跑的好好的

论坛徽章:
0
14 [报告]
发表于 2007-12-12 11:00 |只看该作者
如果你在增加operator[]

那到底是用operator char*还是operator[] ?

论坛徽章:
0
15 [报告]
发表于 2007-12-12 12:58 |只看该作者
#include <stdio.h>
#include <string>
using namespace std;
class test
{
public:
    operator char*()
    {
        static char sz[]="123";
        return sz;
    }
    char& operator[](int i)
    {
        static char sz1[]="456";
        return sz1;
    }
};

int main(int argc, char* argv[])
{
    test p;
    p[2] = 'c';
    printf("0:%c\n", p[0]);
    printf("1:%c\n", p[1]);
    printf("2:%c\n\n", p[2]);
    char *q = p;
    printf("0:%c\n", q[0]);
    printf("1:%c\n", q[1]);
    printf("2:%c\n", q[2]);

    return 0;
}
ok:看到歧义了

论坛徽章:
0
16 [报告]
发表于 2007-12-12 19:48 |只看该作者
yjm0573: 我认为你的看法是不确当的;我写了以下两个测试程序,终于发现了原因:编译对[]操作符号重载的处理是会有不同的解释;好像是先解释成数组,那么自然的就是先operator const char*()运算了,然后才是运算符号重载;但是如果不写operator [](int i);那么就不能使用数组形式的操作;具体的请看代码:

A.cpp(可以编译成功)
class A
{
public:
        operator char*()
        {
                return m_szBuffer;
        }
        char& operator [](int i)
        {
               return m_szBuffer;
        }
private:
        char m_szBuffer[256];
};
void fun(const char *buf)
{
}
int main(int argc, char* argv[])
{
        A a;
        a[2]='c';
        fun(a);
        return 0;
}

B.cpp(不能编译成功)
class A
{
public:
        operator char*()
        {
                return m_szBuffer;
        }
        char& operator [](unsigned int i)
        {
               return m_szBuffer;
        }
private:
        char m_szBuffer[256];
};
void fun(const char *buf)
{
}
int main(int argc, char* argv[])
{
        A a;
        a[2]='c';
        fun(a);
        return 0;
}

论坛徽章:
0
17 [报告]
发表于 2007-12-13 09:55 |只看该作者
前面我就是这个意识啊,可能表达不清楚

b.cpp的2前面加个(unsigned int)估计可以编译通过的吧

a[0] = 'c'

实现过程应该是先调用operator char*将对象a附给了一个临时的char*,然后再调用char& operator[](int i)在这个临时的char*上附值吧

[ 本帖最后由 yjm0573 于 2007-12-13 10:02 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP