c++ 这个类该怎么设计

shewa 发布于 2012/03/16 21:24
阅读 706
收藏 0

有两个类A和B。其中

class a

{

  int x;

   class B;

};

class B

{

void f();

}

 

现在我在实现B::f()时,需要使用A::x这个变量。怎么处理呢?

我的一个想法是,在B中保留一个A的指针,即

class B

{

A* a;

void f();

};

但是我觉得这样设计的话,A和B之间耦合性太大了,不太好。

有什么别的设计方法吗?

加载中
0
中山野鬼
中山野鬼
class B是父类(这是屁话)只是想强调,是否class B 确实有访问子类数据的必要。如果有,可以传指针进去。当参数传入。此时这个传入源并不是一定要求是子类的。
0
Lunar_Lin
Lunar_Lin

    "需要使用A::x这个变量"  本来就存在这种设计上的耦合, 代码故意 躲开 也没任何意义啊...

     可以考虑B当A的内部类. 不过我不知道你A,B具体的含义, 如果毫无关系, 那你还是使用: B对象拥有A对象的指针吧.

0
周翼翼
周翼翼

这个的方法太多了,看你具体要怎么用.

一个办法是,让B做为A的子类.

class a
{
  int x;
  public:
  int getx();
};

class B:public A
{
  void f()
  {
   int x = getx();
  }
};

shewa
shewa
继承不太好,逻辑上不通。 写的是遗传算法。 A是population类。 B是individual类
Lunar_Lin
Lunar_Lin
继承还是少用为好. 每本经典的C++书籍都很强调来强调去,少用继承,多用组合. 嘿嘿. 即使接口类似程度很高, C++也还是更偏向pImpl手法,而不是定义一个抽象类.
0
中山野鬼
中山野鬼
问题是。楼主貌似把B当A的父类了。
shewa
shewa
没有把B当成A的父类。我在写遗传算法,A是Population类,B是individual类。所以,A需要包含若干个B类的对象。在对individual的适应度进行评估时,需要用一个具体的问题对Population中的所有individula个体进行评估。所以,B的评估函数需要访问A的内部变量IndividualNumber。
0
Z
ZYud

引用来自“周翼翼”的答案

这个的方法太多了,看你具体要怎么用.

一个办法是,让B做为A的子类.

class a
{
  int x;
  public:
  int getx();
};

class B:public A
{
  void f()
  {
   int x = getx();
  }
};

friend类
shewa
shewa
让B成为A的friend?关键我在实现B的时候,B不知道A的存在啊。所以,B::fun()就不知道具体用哪个A的对象的int x变量啊
0
lcl
lcl
也可以采用单实例的中介者类,让A、B都跟他耦合,这样在一定程度上也减少了耦合度。
shewa
shewa
设计模式就知道工厂模式,别的没怎么看过。有空好好研究一下
0
hbq0449
hbq0449

如果你的Class A一定要包含Class B的话, 那你A, B之间的耦合是不可避免的, 是由于你的逻辑造成的, 如果你想降低耦合度, 你可以考虑使用

Class B
{
    void f(const int& x);
}

这种方式去实现你的B, 当f()被调用的时候, 将a.x作为参数传递进去就好了.

0
囧小约
囧小约

可能这个方法不是很好:搞个getter的函数GetX,再把那个B类当成是A类GetX函数的适配器。传对象和函数指针进去。

class A {
private:
	int x;
public:
	A(int x) {
		this->x = x;
	}
	
	int getX() {
		return x;
	}
};

template <class C>
class Adapter {
public:
	typedef int (C::*Callback)();
	Adapter(C& object, Callback method): _pObject(&object), _method(method)	{
	}

	void f() {
		int p = (_pObject->*_method)();
	}

private:
	Adapter() {}
	C*  _pObject;
	Callback _method;
};


int main(int argc, char* argv[]) {
	A obj(100);
	Adapter<A> adapter(obj, &A::getX);
	adapter.f();
	return 0;
}

0
中山野鬼
中山野鬼

呵呵。遗传算法?我10年前曾经折腾过一段时间,看了不少论文。不过觉得数学基础上,并没有什么好的东西折腾。最近10年有什么好的理论进步?

另外,遗传算法这个东西,你用C++写做什么?

如果你不觉得需要知识保密或技术保密。如果我觉得你算法确实有值得一试的价值。我可以帮你用C实现。我所谓有价值是,你的算法至少你去出论文,是有价值的,我不需要挂名字。但你也别随便搞的啊猫啊狗的东西忽悠。

shewa
shewa
或者 msn: mengqingxi890 AT gmail DOT com
shewa
shewa
可以留邮箱私聊。mengqingxi89 AT 126 DOT com 或者qq:810559770
0
中山野鬼
中山野鬼
加你QQ了。
返回顶部
顶部