【问题标题】:C++ Passing Polymorphic Pointer of Pointers to FunctionC ++将指针的多态指针传递给函数
【发布时间】:2013-04-28 10:05:54
【问题描述】:

在尝试缩短代码以提高可读性时,我最终更改太多并犯了错误。这仍然是浓缩的,但直接来自我的代码。

我的问题是我有一个名为“function”的类和一个派生类“pwfunction”,它们都有 virtual () 运算符。我想将指向我的“函数”对象的指针数组传递给各种实际函数并使用 () 运算符。

最终编辑:这是我所说的 SSCCE 版本。

#include <iostream>

using namespace std;

class function
{
public:
    virtual double operator () (double x) {return 1.5;}
};

class pwfunction : public function
{
public:
    virtual double operator() (double x) {return 2.0;}
};

void interface();
void definefuncs (function** funcs, long unsigned numfuncs);
void interpolate(function* infunc);
void solvefuncs(function** funcs, long unsigned numfuncs);

int main()
{
    interface();
    return 0;
}

void interface()
{
    long unsigned numfuncs = 1;
    function* funcs[numfuncs];

    definefuncs(funcs, numfuncs);

    solvefuncs(funcs, numfuncs);
}

void definefuncs (function** funcs, long unsigned numfuncs)
{
    interpolate(funcs[0]);
}

void interpolate(function* infunc)
{
    infunc = new pwfunction();
    cout<< (*infunc)(1.5)<<endl;    //works
}

void solvefuncs(function** funcs, long unsigned numfuncs)
{
    cout<< (*funcs[0])(1.5);    //Error Message: Segmentation fault
}

【问题讨论】:

  • Works for me。 valgrind 也没有抱怨。如果你在复制代码时犯了一个错误,你会不会也犯了另一个错误?确保在此处粘贴 SSCCE,并确保您粘贴的代码确实表现出您声称的行为。

标签: function pointers multidimensional-array


【解决方案1】:

问题出在以下几点:

void interpolate(function* infunc)
{
    infunc = new pwfunction();
    cout<< (*infunc)(1.5)<<endl;    //works
}

可能没有做你想做的事。 infunc 是在本地分配的,这不会影响外部的任何其他内容或此函数(顺便说一句,内存泄漏)。插值应该要么返回infunc,要么分配原始变量,比如

void interpolate(function*& infunc) ...

【讨论】:

  • 是的,当我为我的对象实现一个适当的容器时,内存泄漏将立即得到处理。该程序旨在将数据列表插入各种数学函数并对其进行一些数值分析。但你是说,即使我将它作为指针传递,它也会复制指针 infunc,将副本分配给新的 pwfunction 而不是原始指针 infunc?
  • 我的意思是infunc = new pwfunction(); 实际上将您分配的函数分配给传递给 interpolate() 的变量的副本。所以有两个后果:原始变量仍然没有改变(未初始化)导致你的崩溃和内存泄漏。
  • 哇哦!谢谢!我不知道你可以通过引用传递指针。
【解决方案2】:

您没有为somefunction 中的funclist 数据分配数组,所以任何事情都可能发生。也许你的意思是

func* funclist[1];

表示func 指针的单元素数组。

【讨论】:

  • 是的,这是一个错字。不过我还是有这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多