Thinking in c++里面的例子程序的问题

airwing 2001-08-10 11:51:45
struct X;//declaration (incomplete type spec)

struct Y
{
void f(X*); //void f(X);
};

struct X //definition
{
private:
int i;
public:
friend void Y::f(X*); // f(X);
};

void Y::f(X x) // f(X* x)
{
x->i = 1; // x.i = 1;
}

int main()
{
Y y;
X x;
y.f(&x); // y.f(x);
}

这一段程序解释了友元的用法,其中有关于交叉引用的阐述。
他提到“。如果试图传递整个对象,编译器就必须知道X的全部定义以确定它的大小以及如何传递它,这就使程序员无法声明一个类似于Y :: f(X) 的函数。”
但是我用GCC编译时,可以声明类似于Y :: f(X) 的函数,及我在注释里的写法。
这是怎么回事,是书错了吗?请高手指教!
...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicblue 2001-08-13
  • 打赏
  • 举报
回复
do_do说的也许是对的,如果是那样的话《THINKING IN C++》就错了?呵呵
我现在这里没有编译器,如果以下代码能编译成功的话就说明do_do是对的,应该是的(前提是我的猜想正确):)
class C
{
public:
void function(C x){}
private:
int a;
};
airwing 2001-08-12
  • 打赏
  • 举报
回复
对不起大家,一天没来看.其实我大体的理解和大家也差不多.小飞侠看到了我贴代码时的错误.但大家还是理解我的意思的.
先加分,看还有高手发表看法没有.好像现在各个厂商的编译器都没有这个问题
magicblue 2001-08-11
  • 打赏
  • 举报
回复
struct X //definition
{
private:
int i;
public:
friend void Y::f(X*); // 参数类型为X* (传地址)
};

void Y::f(X x) // 参数类型为X (传值)怎么和声明的不一样啊?不懂
{
x->i = 1;
}

airwing 2001-08-11
  • 打赏
  • 举报
回复
没人解释吗?为什么能用,不能给个说法吗。我觉得这一点书还是说得有一定道理的,不知道X的全部定义以确定它的大小怎么能声明Y::f(X)这样的函数呢
TeddyBro 2001-08-11
  • 打赏
  • 举报
回复
我不知道我说的是否是你想知道的,我照着你的例子解释吧
struct X;//declaration (incomplete type spec)
//这个声明只是告诉编译器有一个叫X的结构,但其细节不清

struct Y
{
void f(X*); //void f(X);
//在这里X*的定义用到了上面的关于X的声明,因为这里的函数声明没有用到X的细节,所以编译没问题。
};

struct X //definition
//定义X的细节
{
private:
int i;
public:
friend void Y::f(X*); // f(X);
};

void Y::f(X x) // f(X* x)
{
x->i = 1; // x.i = 1;
//这里用到x->i,这属于X的细节,如果没有上面的X的细节定义这里是编译不过的。
}

int main()
{
Y y;
X x;
y.f(&x); // y.f(x);
}


总之,
在用到一个类的名字时,只需要那个类的声明;
在用那个类的具体操作或成员时,必须先有类的具体定义。

Last_Dodo 2001-08-11
  • 打赏
  • 举报
回复
It is because
struct Y
{
void f(X);
};

Does not need detail of X.
If it changes to:
struct Y
{
X x;
...
};
It will not compile.
TYmir 2001-08-11
  • 打赏
  • 举报
回复
编译器的不同,即便你和作者用的是同一个编译器,但是如果版本不同,那也是不行的!
magicblue 2001-08-11
  • 打赏
  • 举报
回复
你说的意思我是明白,《THINKING IN C++》是95年(好象是)的书了,过了5,6年编译器的功能肯定比当时强多了,就像MountLion说的。编译不一定得从上到下一个接一个的编译,也许编译器看到
struct Y
{
void f(X);
};
这样的代码时会暂时跳过,接着编译struct X,完了以后再跳回原来的地方呢?呵呵,不知算不算异想天开~~~~~我也没看过编译原理:)

airwing 2001-08-10
  • 打赏
  • 举报
回复
那么应该怎么解释呢?按道理来讲,书上讲的还是友一定道理的。
MountLion 2001-08-10
  • 打赏
  • 举报
回复
老式的编译器不行,从TC++就支持了
gorge_an 2001-08-10
  • 打赏
  • 举报
回复
当然可以按照你的写法,但是我不知道是不是书上写错了!
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。

70,038

社区成员

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

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