c++内部类怎么访问外部类

kingstarer 2009-05-22 11:33:49
想了好几种方法,但都不符合标准操作,不知各位有没有其它更好的方法推荐


/*
//目标
class outclass
{
public:
int m_i;

class inclass
{
public:
//通过in的set_i操作修改外部类的m_i变量
void set_i(int i)
{
::m_i = i;
}
}in;
};
*/

class outclass_1
{
public:
int m_i;

class inclass
{
public:
void set_i(int i)
{
outclass_1 *parent = (outclass_1 *) (this - &((outclass_1 *)(0))->in);
parent->m_i = i;
}
}in;
};


class outclass_2
{
public:
int m_i;

outclass_2():in(this)
{

}

class inclass
{
public:
outclass_2 *m_parent;

inclass(outclass_2 *parent):m_parent(parent)
{
}

void set_i(int i)
{
m_parent->m_i = i;
}
}in;
};


class outclass_3
{
public:
int m_i;

outclass_3()
{
in.m_parent = (outclass_3 *) this;
}

class inclass
{
public:
outclass_3 *m_parent;

void set_i(int i)
{
m_parent->m_i = i;
}
}in;
};


int main()
{
outclass_1 out_1;
out_1.in.set_i(123);
cout << out_1.m_i << endl;

outclass_2 out_2;
out_2.in.set_i(123);
cout << out_2.m_i << endl;

outclass_3 out_3;
out_3.in.set_i(123);
cout << out_3.m_i << endl;

return 0;
}
...全文
4318 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxDreamer 2011-02-25
  • 打赏
  • 举报
回复 1
古老的帖子了。

“通过in的set_i操作修改外部类的m_i变量”
本身只能存在在对象实例上的问题,要不就是直接访问静态变量。

c++和java的内部类不一样。虽然不能说内部类只是放在某个类中的普通的类,也不能说内外毫无关系。
但c++确实把内部类仅仅当成一个声明,java貌似涉及到实例化的问题。

{我是scjp 1.4哈哈,java忘干净了。}
kingstarer 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tugouxp 的回复:]
outclass_1 *parent = (outclass_1 *) ((char*)this - offsetof(outclass_1,in));
这是com实现中实现内嵌类访问外部类数据成员中所使用的方式,具体见《COM本质论》中有一摸一样的代码。
[/Quote]
原来com也是这样实现的,那看来是没有其它更好的方法了
goodname 2009-05-23
  • 打赏
  • 举报
回复
class outclass
{
public:
outclass(){m_i = 0;}
int m_i;

class inclass
{
public:
void set_i(outclass& a, int i)
{
a.m_i = i;
}

}in;
};

int main()
{
outclass A;
A.in.set_i(A,10);//多传一个参数,进去,其实这样不仅可以传A,还可以传别的,也不是很好,抛砖引玉吧.

return 0;
}

papaofdoudou 2009-05-23
  • 打赏
  • 举报
回复
outclass_1 *parent = (outclass_1 *) ((char*)this - offsetof(outclass_1,in));
这是com实现中实现内嵌类访问外部类数据成员中所使用的方式,具体见《COM本质论》中有一摸一样的代码。
papaofdoudou 2009-05-23
  • 打赏
  • 举报
回复
outclass_1 *parent = (outclass_1 *) ((char*)this - offsetof(outclass_1,in));
lzh9955 2009-05-23
  • 打赏
  • 举报
回复
组合?
zhh157 2009-05-23
  • 打赏
  • 举报
回复
我怎么觉得你的设计这么别扭呢

成员变量都可以直接访问
封装和信息隐藏如何体现
这样的代码组织,耦合度会非常大
对灵活性和可扩展性都非常不利

不想改变的话,就和你说的一样用public成员变量就可以了

kingstarer 2009-05-23
  • 打赏
  • 举报
回复
谢谢 不过我现在被要求不能修改外围访问接口

outclass_1 out_1;
out_1.in.set_i(123);
cout << out_1.m_i << endl;

所以不能采用这个方法

另:
上面这种方法是不是要像outclass_3一样,把this强制转成非const型才能做为new的参数?

zhh157 2009-05-23
  • 打赏
  • 举报
回复
写快了,应该是一个指针,需要分配内存。

class A
{
A(int n) : mem(n)
{
pb = new B(this);
}
private:
...
B* pb;
}
kingstarer 2009-05-23
  • 打赏
  • 举报
回复
LS的用法跟我的outclass_2用法是一样的,会产生警告,this在初始化列表中使用

一样也不合适
zhh157 2009-05-23
  • 打赏
  • 举报
回复
依赖于内存结构的“奇技淫巧”貌似意义不大

在一个类中对另一个类中的成员变量进行操作
那么类的封装性会被破坏
如果这样,还不如直接合并为一个类

如果只是针对接口的操作
传递对象指针进去就可以了

class A
{
public:
A(int n) : mem(n), b(this) {}

void SetMember(int n);
...

private:
int mem;

class B
{
public:
B(A* p) : parent(p){}

void SetParentMember(int n)
{
parent->SetMember(n);
}
private:
A* parent;
};

B b;

};
kingstarer 2009-05-23
  • 打赏
  • 举报
回复
LS的文章里面似乎没提到怎么访问外部类的非静态成员?
red_berries 2009-05-23
  • 打赏
  • 举报
回复
都不错
goodname 2009-05-22
  • 打赏
  • 举报
回复
http://blog.csdn.net/rabbit729/archive/2008/11/19/3334272.aspx

虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。

若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。

http://www.cppblog.com/fwxjj/archive/2006/11/21/15507.aspx



4、 嵌套类可以直接访问外围类的静态成员、类型名( typedef )、枚举值。


kingstarer 2009-05-22
  • 打赏
  • 举报
回复
是指outclass_1的实现吗? 这样做好像受限于内存的排列了,不是很喜欢这种方法

mengde007 2009-05-22
  • 打赏
  • 举报
回复
根据你的这个情况可以使用固定偏移得到外部类的指针;

64,702

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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