【发布时间】:2010-01-13 16:23:36
【问题描述】:
我想编写一组处理一些(例如布尔值)操作的 D_I 类(又名 I=1,2,...只是我的意思是 '_I' 是类专有名称,而不是整数) F 对于所有类具有相同的含义。但我也想对这些类的对象的“总和”进行操作,组的不同类可能被“添加”在一起。上述对象求和的操作取决于相加对象的相应操作。
这就是为什么我要创建通用的基类 B 来处理“求和”的操作:
class B
{public:
B (): LEFT(NULL), RIGHT(NULL) {};
B (const SpBrd& S);
B (const B& A, const B B);
~B ();
{if (LEFT != NULL) delete LEFT; // NULL if it is default B or D_I
if (RIGHT != NULL) delete RIGHT; // NULL if it is default B or D_I
}
B operator + (const B& S) const;
bool F(const Point& P) const;
{bool b = aF(P);
if (LEFT != NULL) b = b && LEFT->F(P); // this is how F depends
if (RIGHT != NULL) b = b && RIGHT->F(P); // of added classes
}
protected:
virtual bool aF(const Point& P) const {return true;}; // Default!
B* LEFT; // Pointer to left operand of "sum"
B* RIGHT; // Pointer to right operand of "sum"
// (since it might point to D_i class too as well)
};
所以这种方式派生类 D 很容易编写,因为它应该只处理它的构造函数和 aF:
class D_I: public B
{public:
D() {...};
protected:
virtual bool aF (const Point& P) const
{// return something here
}
};
问题是:如何编写运算符+和B类的复制构造函数:
B:B (const B& S)
{if (S.LEFT != NULL) LEFT = new B (S.LEFT)
if (S.RIGHT != NULL) RIGHT = new B (S.RIGHT)
};
B B:operator + (const B& S) const
{SpBrd S;
S.LEFT = new B (*this);
S.RIGHT = new B (S);
};
不会产生正确的结果,因为如果 'operator +' 或 'S.LEFT' 中的 'this'、'S' 或复制构造函数中的“S.RIGHT”并不是指 B 类的对象,而是指 D_I 类之一的对象。
所以,我找不到让 B::operator+ 知道 sum 的类型来源的方法,因为可能存在大量 D_I 并且会不时添加它们。我应该怎么做才能正确地写这一切?
我不能为所有 (D_I,D_J) 对编写 D_I operator+ (D_J) 和 D_I::D_I(const D_J) 的 pars,这是不公平的!
(这将表示空间中的边界(表面)。函数 F 表示在边界内 - 即检查该点是否在空间主体内。但是我想要操作的边界内的物体可能是交集( operator+) 在其他两个边界内的空间体。示例:两个球体边界的交集——内部和外部区域——产生球壳,也就是 3D 环;可能还想查看半径为 R 和立体角为 10*10 的交点球面边界围绕极点的度数等等。)
【问题讨论】:
-
请原谅 StackOverflow 不尊重我的段落中断,但无论如何:
SpBrd是什么?底部的 Operator+ 没有语法意义。class B甚至不会在我的脑海中编译,因为它的 ctors 和 dtor 的名称是错误的。另外,考虑改写你的问题。不清楚:“团体课”?避免被动语态。无论我如何尝试阅读它,“1) in operator + if *this and S are not B but one D_I should be 'new D_I”对我来说甚至不像一个正确的英文句子。第 2 点同上)。我会停在这里。 -
哦,我的上帝,我很抱歉......问这个问题我只是通过删除额外的函数来删除我的程序片段,这里无关紧要,并将 SpBrd 和 SphBrd 等类名更改为 Base 和 Derive (简称 B 和 D)以免使读者感到困惑,但事实恰恰相反……我还对那段进行了释义。再次抱歉。
-
我更新了我的答案。我认为它回答了您现在提出的问题,尽管我仍然对此感到困惑。
-
您是说要为每个 i 定义一个类 D_i 吗?在一个名为 D_1 的类中,另一个名为 D_2,第三个名为 D_3 等等?如果是这样,请改用模板,并定义一个类
template <int i> class D; -
在您接受的答案中,我似乎重新发明了 Curiously recurring 模板模式,因为它适用于复制构造。见:en.wikipedia.org/wiki/…
标签: c++ inheritance pointers operators