在下面的代码中考虑以下语句: - “int B :: * bpm;”
class B
{
public :
int bi;
};
class D : public B
{
};
int main()
{
D obj;
int B::*bpm;
bpm = &B::bi;
obj.*bpm = 1;
return 0;
}
*何时在设计/代码中使用“指向成员的指针”以改进我的设计/编码实践。 **
答案 0 :(得分:3)
来自STL的示例可能有所帮助。
答案 1 :(得分:1)
谈到设计/编码实践,对我而言,使用“指向成员的指针”来访问您的成员并不是一个好的设计,无论如何这些成员都是公开的,并且可以以更明显的方式访问。
答案 2 :(得分:1)
当多个成员需要类似的功能时,有时可以使用指向成员的指针来避免代码重复。另一种方法是使用枚举来标识成员并将它们存储为数组。
struct Foo
{
float a;
float b;
};
void Interpolate(const Foo &x, const Foo &y, float f, int Foo::*member)
{
return x.*member*(1-f)+y.*member*f;
}
int main()
{
Foo x,y;
float ia = Interpolate(x,y,0.5,&Foo::a);
float ib = Interpolate(x,y,0.5,&Foo::b);
}
这只是示例,插值简短,但一旦类似的功能很复杂,这可能是非常有益的。
答案 3 :(得分:1)
指向成员的指针与指向函数的指针具有相似的用途。当你需要它们时(很少在实践中),你就会知道它。
我之前遇到的一个可能的用例是使用模板专门针对某些行为的算法,唯一的目标是不重复自己:
struct foo
{
double f1(double);
...
double fn(double);
template <double (foo::*)(double)> double some_algorithm(...);
};
然后你使用a.some_algorithm<a::&fi>(...)
。
答案 4 :(得分:1)
如果您查看Stroustrup的示例,我认为您可以看到指向成员类型的指针的力量:
class Interface {
public:
virtual start() = 0;
virtual stop() = 0;
virtual pause() = 0;
virtual resume() = 0;
virtual ~Interface() { }
}
typedef void (Interface::*P_MEM) (); // pointer to member type
map<string, Interface*> variable;
map<string, P_MEM> operation;
void call_member( string var, string oper )
{
(variable[var]->*operation[oper])(); // var.oper()
}
这允许动态访问函数或变量。
您如何设置某种算法的行为(参见Alexandre的例子)?
答案 5 :(得分:1)
指向成员的指针对于侵入列表非常有用
template<typename N, N *N::*nextp>
class LinkedList {
public:
LinkedList()
:head(0)
{ }
void add(N *item) {
item->*nextp = head;
head = item;
}
N *gethead() { return head; }
private:
N *head;
};
struct Node {
int data;
Node *next;
};
int main() {
LinkedList<Node, &Node::next> n;
Node a1 = { 1 };
Node a2 = { 2 };
n.add(&a2);
n.add(&a1);
// ...
}
答案 6 :(得分:0)
我不会过分担心会员的指针。在大约十年前的大约15年的C ++中,我使用过它们一次。
已经内置到语言中的功能(即虚函数)可以防止您手动操作成员指针。