c++ - 在构造对象时定义成员函数

标签 c++ constructor function-pointers virtual-functions

我有一个类,其中我需要一个可以为每个对象定义的函数。我希望能够在定义所述对象的 vector 时定义每个对象的特定功能。我对象的这些 vector 将构成库的一部分。这是我正在尝试做的一个不成功的例子:

#include <iostream>
#include <vector>

class FunctionEater {

public:

    virtual double func() {}

    FunctionEater(double (*Func)) {

        func = Func;    // Not sure of the correct syntax here
    }
};

std::vector<FunctionEater> gorgers {

    {
        double () {    // Not sure of the syntax here, or if there is even syntax to do this

            double result = 0.794 * 739.775;
            return result;
        }
    },

    {
        double () {

            double temp1 = 0.794 * 739.775;
            double result = temp1 + 0.62;
            return result;
        }
    }
}

int main()
{
    double snackCrumbs = gorgers[0].func();
    double gorgePoop = gorgers[1].func();

    std::cout << snackCrumbs << std::endl << gorgePoop << std::endl;
}

因此,我正在努力弄清楚或找到很多相关文档的两件事如下:

  • 如何在定义gorgers[]的元素的同时定义函数
  • 如何接受我作为 (*Func) 传递给构造函数的函数,并将其存储为 virtual double func()

我希望能够在对象定义中定义函数。我花了相当多的时间研究如何最好地编写我的对象 vector ,以及在这种情况下视觉上最容易使用的方式,似乎是在一个 block 中定义每个对象的各个方面,同时定义它们包含在 vector 中。

我承认,我也不知道在使用虚函数时 (*Func) 是否正确,但这是对我第一次尝试使用函数指针的改编。我也很乐意接受可能比我尝试使用的方法更好的替代建议。

提前感谢您提供的任何帮助,如有必要,我很乐意编辑或更新我的问题。

皮特

最佳答案

您想要的是您的语言更好的功能特性支持。幸运的是,您使用的是 C++!

在 c++11 之后,我们有了 lambda 和 std::function表示运行时多态函数对象的对象。

lambda 是这样定义的:

auto yourSecondFunc = [](){
        double temp1 = 0.794 * 739.775;
        double result = temp1 + 0.62;
        return result; 
};

我一直很懒,在那里使用了 auto,但实际上,我们可以将它分配给 std::function对象:

std::function<double()> yourSecondFunc = [](){
        double temp1 = 0.794 * 739.775;
        double result = temp1 + 0.62;
        return result; 
};

那个std::function<double()>意思是,该函数不带参数并返回一个 double 值。但是请注意,lambda 的类型不是 std::function。对象,但不是讨论它的地方。

因此,您可以存储 std::function<double()>在你的FunctionEater类:

class FunctionEater {

public:

    std::function<double()> func;

    FunctionEater(const std::function<double()>& f) {

        func = f;
    }

    void callMe() { double res = func(); } // how a function object is used
};

然后,你的 vector 变成这样:

std::vector<FunctionEater> gorgers {
    FunctionEater { []() 
      {
        double result = 0.794 * 739.775;
        return result;
      }
    },
    FunctionEater { []() 
      {
        double temp1 = 0.794 * 739.775;
        double result = temp1 + 0.62;
        return result;
      }
    }
};

还有你的main ?其实是一样的:

int main()
{
    double snackCrumbs = gorgers[0].func();
    double gorgePoop = gorgers[1].func();

    std::cout << snackCrumbs << std::endl << gorgePoop << std::endl;
}

关于c++ - 在构造对象时定义成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705611/

相关文章:

c++ - 指向 deque<int>::push_back 的指针

c++ - 什么时候应该使用内联函数?

c++ - 关于表达式副作用的 Clang 警告

c++ - g++ - 无法链接到使用 VS2012 构建的静态库

c++ - 在 C++ 中,构造函数和析构函数可以是内联函数吗?

C++ 默认构造函数和其他内容的歧义。那是什么别的东西?

c - 将函数指针从 Fortran 传递到 C,与 c_f_procpointer 相反

c++ - QNetworkAccessManager uploadProgress 和 QProgressBar

c++ - 带和不带 ( ) 的构造函数调用之间的区别

c# - c#中的委托(delegate)和c++中的函数指针有什么区别?