【问题标题】:Create objects with unique functionality but same type of data创建具有独特功能但数据类型相同的对象
【发布时间】:2020-12-24 11:57:27
【问题描述】:

我想创建多个对相同数据进行操作的对象,但每个对象对该数据执行不同的功能。

我试图这样做:

class test
{
    public:
        test(int x, int y)
        {  
            this->x = x;
            this->y = y;
        }
        int (*func)();

    private:
        int x;
        int y;
};

int test1()
{
    this->x += 100;
    return this->x; 
}

int test2()
{
    this->x -= 100;
    return this->x; 
}

int main()
{
    test t1(1,2);
    t1.func = &test1;
    
    return 0;
}

但是,它没有编译。因为 test1 和 test2 甚至不知道 x (也不知道这个指针)。 我怎样才能让它工作? 也许我正在尝试使用错误的工具来完成此任务?

【问题讨论】:

  • 您的第一个问题是test1test2 中没有this 指针,因为它们不是成员函数。由于x 也是私有的,您必须在test 中将它们声明为friend 函数。还有更简单的替代方案,例如继承,或者某种模板?
  • 我不希望他们成为这个类的成员......假设有 1000 个测试对象。
  • 有什么理由不向test 添加getter(和setter)函数,以便可以从类外访问数据?然后你的函数可以将test 对象作为参数(例如:const test&)——你甚至可以避免所有函数指针的东西(假设没有任何真正的需要)
  • 在那种情况下,我可以只使用结构,不是吗?我希望能够跟踪在特定测试对象上每次调用 func 后这些数据如何变化。虽然每个测试对象都应该有自己的函数来以不同的方式处理这些数据。
  • structclass 在 C++ 中是一样的,它们只是在默认访问修饰符上有所不同。而且我不明白 getter 和 setter 如何干扰您的跟踪(或者您将如何跟踪当前尝试中的数据更改)

标签: c++ function object


【解决方案1】:

我想你想要这个:

  • 您希望您的私人数据是私密的
  • 您可能希望使用函数指针,而不是指向类方法的指针

你能做什么:

  • 创建一个辅助函数,接受此指针和带有私有数据的结构
  • 用辅助函数调用它

我猜很难以太干净的方式制作它。 这是我的例子:

class test {
public:
    test(int x, int y) {  
        private_data.x = x;
        private_data.y = y;
    }
    struct PrivateData {
        int x;
        int y;
    };
    int (*func)(test*, PrivateData*);
    int call_func() {
        return func(this, &private_data);
    }
private:
    PrivateData private_data;
};

int test1(test *self, test::PrivateData *private_data) {
    private_data->x += 100;
    return private_data->x; 
}

int test2(test *self, test::PrivateData *private_data) {
    private_data->x -= 100;
    return private_data->x; 
}

int main() {
    test t1(1,2);
    t1.func = test1;
    
    return 0;
}

【讨论】:

  • 谢谢,这行得通 :) 我会再试验一下
  • 非常感谢您的帮助!您是否有机会知道如何将 t1.call_func 分配给另一个类型的函数指针: int (*fPptr)(); ?我需要像 fPtr = &t1.call_func 这样的东西。
  • 哇。 call_func 看起来非常简单。为什么要把它当作指针?它只是一个调用func本身的辅助函数。
  • 说来话长......也许我做错了所有这些......但无论如何,我有一个回调函数 - 它根本不知道“测试”对象的存在- 它只是想获得 int 输出。 (所以它只是一个 int (*fPtr)() 形式的函数,我每次都用其他值切换 - 其中一个恰好指向 t1.call_func ...)
  • 但是如何创建测试对象呢?您不能在不知道内存中对象地址的情况下调用该方法。 call_func 不能转换为函数指针,因为它只能转换为成员方法指针。
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多