是C++高手的请进来指点!

vcmfc 2001-02-10 12:58:00
这两个问题是两位网友问的问题,有些地方我也不解,请大虾指点!
问题1.如何取得这个结构的长度,不是大小?(knotery)
typedef struct tagIPHDR //Noram IP header
{
UCHAR h_len:4; //Lenght of the header
UCHAR Version:4; //Version
UCHAR Tos; //Server type(TOS)
USHORT Totlen; //Total lenght
USHORT ID; //ID
USHORT FlagOff; // Flags and Fragment Offset
UCHAR TTL; //Time to live
UCHAR Protocol; // Protocol
USHORT Checksum; // Checksum
IN_ADDR iaSrc; //Internet Address - Source
IN_ADDR iaDest; // Internet Address - Destination
}IPHDR,*PIPHDR;

typedef struct tagICMPHDR //Normal ICMP EchoRequest and EchoReply header
{
UCHAR type; //Type
UCHAR Code; //Code
USHORT Checksum; //Checksum
USHORT ID; //Identification
USHORT Seq; //Sequence
UINT OptData; //Option data
}ICMPHDR;


typedef struct tagICMPECHOREPLY
{
IPHDR iphdr;
ICMPECHOREQUEST IcmpReq;
char cData[256];
}ICMPECHOREPLY;
ICMPECHOREPLY 的长度是16640
Why?
在Think C++中提到的一种方法:
例:int c[] = { 1, 2, 3, 4 };
for(int i = 0; i < sizeof c / sizeof *c; i++)
c[i]++;
那么最佳的方法是啥????????????
问题2:这个错误该如何解决?,其错误原因是什么?
class A
{
public:
A();
private:
const char szBuf[20];
};
A::A() : szBuf("Bridge")//我估计是这里赋值是错误的,指点?
{;
}
正确的方法呢?
高手??大虾??高手??大虾??高手??大虾??高手??大虾??高手??大虾??
...全文
598 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlovexyj 2001-02-12
  • 打赏
  • 举报
回复
o ft
vcmfc 2001-02-12
  • 打赏
  • 举报
回复
谢谢两位的回答,这是我在学习C++过程中发现两位网友问的,用我当时的知识觉得有迷惑,特提此贴,以下是我的看法:
1.在《Think C++》中也是提到用const char *来使用字符串,可是那位网友却用char szbuff[20],那么在用数据为何不不行却有点不解,现实中我还是偏向用指针。
2.我也分不清楚长度与大小的区别!,不知道C++有此分法吗?,按C++所说,sizeof()就是返回大小,可能是我理解长度理解错误了。

继续讨论呀!
vcmfc 2001-02-12
  • 打赏
  • 举报
回复
谢谢两位的回答,这是我在学习C++过程中发现两位网友问的,用我当时的知识觉得有迷惑,特提此贴,以下是我的看法:
1.在《Think C++》中也是提到用const char *来使用字符串,可是那位网友却用char szbuff[20],那么在用数据为何不不行却有点不解,现实中我还是偏向用指针。
2.我也分不清楚长度与大小的区别!,不知道C++有此分法吗?,按C++所说,sizeof()就是返回大小,可能是我理解长度理解错误了。

继续讨论呀!
vcmfc 2001-02-12
  • 打赏
  • 举报
回复
谢谢两位的回答,这是我在学习C++过程中发现两位网友问的,用我当时的知识觉得有迷惑,特提此贴,以下是我的看法:
1.在《Think C++》中也是提到用const char *来使用字符串,可是那位网友却用char szbuff[20],那么在用数据为何不不行却有点不解,现实中我还是偏向用指针。
2.我也分不清楚长度与大小的区别!,不知道C++有此分法吗?,按C++所说,sizeof()就是返回大小,可能是我理解长度理解错误了。

继续讨论呀!
chenf 2001-02-12
  • 打赏
  • 举报
回复
问题1:显然你指的大小是一个对象占据内存的字节数,sizeof解决,而你说的长度是什么?是数组元素个数吗?那么你写的下边代码就是最好的解决方法了。当然数组必须是同质的,如果是异质数组,大概要一些复杂的代码管理,其间自然要维护这个“长度”。
问题2:const的数据类型在语义上是不可修改的,也就是不允许什么函数来修改(当然,C语言的强制性可以满足任何要求),只有一次修改可称为赋初值,这个赋初值通过C语言内置的代码来完成,(这时侯当然可以修改,并不是说const不起作用)。而不会通过strcpy类似的函数来完成。
在类的类型定义中不可能有真正的代码(想想对象生成的概念,如果有代码,什么时候执行呢?对象初始化时,那不正就是构造函数吗),所以const成员的初始化只好在构造函数中作,而且不能通过函数体的代码(那就是试图修改const值的错误),而只能在构造参数中传递。但数组对象的初始化代码不能和数组声明分开,这点没有什么好的方法。
最后解决就是考虑你究竟要作什么,特别就是const的使用,如果你确信szBuf要使用const,就是说你不希望它以后被修改,那么何必在每个对象中放一个数组呢?使用char *,指针非常好初始化。用了数组,就不要使用const,你可以在任何时候修改,设置它。
fengye 2001-02-12
  • 打赏
  • 举报
回复
Question 2:
const变量不能赋值,只能初始化,所以要放在构造函数的初始化列表中。
zhq2000的方法一中可以用下面的声明来保证szBuf不可改变。
const char * const szBuf;
somn 2001-02-11
  • 打赏
  • 举报
回复
第二个问题:
你才对了,就是哪里有问题,你怎么可以对一个常量赋值呢?
vcmfc 2001-02-11
  • 打赏
  • 举报
回复
高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?
vcmfc 2001-02-11
  • 打赏
  • 举报
回复
高手呢?,我哪里得罪了大家了,有不对之处就大家海函,是为本人是在太菜了,一直不停的学习,希望能从超级菜鸟升级到菜鸟级,希望我的理想不是太遥远!,也请高手给俺解解惑!,谢谢大家!
vcmfc 2001-02-11
  • 打赏
  • 举报
回复
高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?高手呢?
vcmfc 2001-02-11
  • 打赏
  • 举报
回复
那正确的赋值方法呢?
zhq2000 2001-02-10
  • 打赏
  • 举报
回复
2 方式一(使用指针):
const char * 中好象const并不起作用。

class A
{
public:
A();
private:
//const char szBuf[20];
const char *szBuf;
};

A::A():szBuf("Bridge")
{
}

const char * A::get()
{
return szBuf;
}

void main()
{
A a;

printf("\nA::szBuf = %s\n" , a.get());
}

2.方式二(使用static):
class A
{
public:
A();
const char * get();
void set(const char * psz);
public:
static const char szBuf[20];
};

const char A::szBuf[20] = "Bridge";

A::A()
{
}

注:在方式一中 ,szBuf 的值是可改变的,也是const不起作用,你可以把private改为public,此时类的外部也能直接改变其值。
在方式二中 ,我只能使用static(由于个人局限,其它方法未知),因为使用const定义的字符数组,无法使用strcpy函数赋值,所以在其内部外部都无法改变它的值。只有用static可以才能对其初始化。
zhq2000 2001-02-10
  • 打赏
  • 举报
回复
2 方式一(使用指针):
const char * 中好象const并不起作用。

class A
{
public:
A();
private:
//const char szBuf[20];
const char *szBuf;
};

A::A():szBuf("Bridge")
{
}

const char * A::get()
{
return szBuf;
}

void main()
{
A a;

printf("\nA::szBuf = %s\n" , a.get());
}

2.方式二(使用static):
class A
{
public:
A();
const char * get();
void set(const char * psz);
public:
static const char szBuf[20];
};

const char A::szBuf[20] = "Bridge";

A::A()
{
}

注:在方式一中 ,szBuf 的值是可改变的,也是const不起作用,你可以把private改为public,此时类的外部也能直接改变其值。
在方式二中 ,我只能使用static(由于个人局限,其它方法未知),因为使用const定义的字符数组,无法使用strcpy函数赋值,所以在其内部外部都无法改变它的值。只有用static可以才能对其初始化。
沒有名字 2001-02-10
  • 打赏
  • 举报
回复
我的oicq 20726395
你找我!!
KAO!你也在线,那怪我无法回复!!

因为在列表里的 编译器会这么处理 szBuf="Bridge",你认为这样可以吗??哈哈!!
所以这是不行的一个原因
vcmfc 2001-02-10
  • 打赏
  • 举报
回复
to 楼上:我想知道原来为什么不行,而不是放到构造函数中!
沒有名字 2001-02-10
  • 打赏
  • 举报
回复
class A
{
public:
A();
private:
const char szBuf[20];
};
A::A()
{
strcpy(static_cast<char*>szBuf,"Brige");
}

69,375

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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