4

这实际上是一个下棋程序,但代码太长,无法在此处发布,因此我将使用一个更简单的无关示例:

假设我有一个这样的对象:

class A{
    int x1;
    int x2;
public:
    int Average(){ return (x1+x2)/2; }
};

我想要一个名为 AveragesList 的向量,它存储每个对象的所有 x1 和 x2 值的所有平均值(或指向它们的指针)。所以我试着这样做:

vector<int>* AveragesList;

class A{
    int x1;
    int x2;
public:
    int Average(){ return (x1+x2)/2; }
    A(){ AveragesList.push_back(this->Average); } //trying to add pointer to member function Average() to AveragesList
};

但是当我尝试这个时,我收到一条消息说“指向绑定函数的指针只能用于调用函数”。有解决办法吗?我不想简单地将 x1 和 x2 的平均值放在 AveragesList 中,因为如果 x1 或 x2 发生变化,AveragesList 中的值不会。另外,我的书说不要在 C++ 类中使用公共变量,所以我不确定是否应该使用一个。

4

3 回答 3

4

在 C++11 之前,在 C++ 中没有内置的方法来处理闭包,因此在不使用 boost 等库的情况下解决问题的最简单方法如下:定义一个名为 的整数成员变量average,除了你的x1x2变量。创建对象时将平均值设置为正确的值,并在每次更改x1x2更改时更新它。将指针存储在列表中,并使用它来访问平均值。

这不如即时计算结果。如果您使用的是 C++11,则可以使用更好的解决方案:

#include <iostream>
#include <vector>
#include <functional>

class A{
    int x1;
    int x2;
public:
    A(int _x1, int _x2) : x1(_x1), x2(_x2) {}
    int Average(){ return (x1+x2)/2; }
    void setX1(int _x1) { x1 = _x1; }
    void setX2(int _x2) { x2 = _x2; }
};

using namespace std;

int main() {
    vector<std::function<int()>> v;
    A a1(1, 5);
    A a2(2, 8);
    v.push_back([&]{return a1.Average();});
    v.push_back([&]{return a2.Average();});
    for (int i = 0 ; i != v.size() ; i++) {
        cout << v[i]() << endl;
    }
    a1.setX1(7);
    a2.setX2(32);
    for (int i = 0 ; i != v.size() ; i++) {
        cout << v[i]() << endl;
    }
    return 0;
}
于 2012-05-31T02:37:08.820 回答
1

如果您不想存储“平均”的当前值......那么为什么不存储对“A”的引用呢?

例子:

Class A{
    int x1;
    int x2;
public:
    A (int x1, int x2) { this->x1 = x1; this->x2 = x2; }
    int Average(){ return (x1+x2)/2 }
};

...

int
main (int argc, char *argv[])
{
  vector<A> averagesList;
  averagesList.push_back (new A(3, 4));
  ...
于 2012-05-31T02:32:20.980 回答
1

要执行您想要执行的操作(我猜),您还需要存储将用于调用函数的对象的指针:

#include <vector>
#include <iostream>

class A {
  int x1,x2;
public:
  int Average(){ return (x1+x2)/2; }
  A(int a, int b);
};

std::vector< A* > objectVec;
std::vector< int (A::*)() > functionPtrVec;

A::A(int a, int b):
  x1(a), x2(b) {
  objectVec.push_back(this);
  functionPtrVec.push_back(& A::Average);
}

int main() {
  A a1(1,3);
  A a2(10,20);

  for (int k=0; k<objectVec.size(); k++) {
    int (A::* memberFuncPtr)() = functionPtrVec[k];
    A*object = objectVec[k];
    std::cout << (object->*memberFuncPtr)() << std::endl;
  }
  return 0;
}

您可以使用 apair将它们存储在同一个 中vector,或者定义您自己的成员仿函数类来存储对象、成员函数指针并具有()运算符。

HTH。

于 2012-05-31T02:41:21.207 回答