C ++:在另一个方法中调用依赖于对象的方法

时间:2016-07-01 16:51:50

标签: c++ class object methods

我正在努力将一些处理从C ++驱动程序转移到我工作的环境中的类中的新方法。我已经开始研究该方法,但是当我尝试从新编写的方法调用类中存在的其他依赖于对象的方法时,我遇到了问题。以下是一些代码:

bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                  long out_freq_a) {

  // display debugging information
  //
  if (debug_level_d >= Edf::LEVEL_DETAILED) {
    fprintf(stdout, "Edf::resample_edf(): starting resample/n");
  }

  // get the labels in the file
  //
  char* labels[Edf::MAX_NCHANS];

  long num_channels = Edf::get_labels(labels);

  long num_samples = (long) Edf::get_duration() * Edf::get_sample_frequency();

...

get_labels(labels)get_duration()get_sample_frequency()方法都是我正在使用的Edf类的所有方法,但在尝试编译时会出现此错误。

edf_01.cc:2240:45: error: cannot call member function ‘long int Edf::get_labels(char**)’ without object
   long num_channels = Edf::get_labels(labels);
                                             ^
edf_01.cc:2242:47: error: cannot call member function ‘double Edf::get_duration()’ without object
   long num_samples = (long) Edf::get_duration() * Edf::get_sample_frequency();

所有方法都是公共方法,但它们使用的一些变量在类中受到保护。

我不确定如何解决这个问题,但我会继续研究它。谢谢你的帮助。如果需要更多信息,请告诉我。

编辑:我想有一些误解,所以我会提供更多信息。

调用此方法的实用程序中已存在Edf对象。该实用程序目前看起来像这样:

// local include files
//
#include <Edf.h>
...
int main(int argc, const char** argv) {
...
  // create an Edf object
  //
  Edf edf(Edf::LEVEL_NONE);

  // resample the signal
  //
  if (!edf.resample_edf(sig_in, sig_out, out_freq)) {
    fprintf(stdout, " **> nedc_resample_edf: error resampling signal\n");
    return((status = -1))
  }
...

resample_edf方法是edf对象中的方法。现在,在该方法中,我希望能够从对象中调用其他方法,但是我在这样做时遇到错误。在此方法中重新实例化edf对象对我没有帮助。我尝试了多种方法,但没有任何效果。

我最初没有包含实用程序的运行方式,因为类的编译与实用程序无关。问题来自该方法如何从同一对象调用其他方法。 Edf课程非常大,所以很难为你提供整个课程。

很抱歉,如果原帖不明确。

2 个答案:

答案 0 :(得分:1)

您还没有向我们展示Edf类/结构,但错误消息非常清楚。

  

error: cannot call member function ... without object

Edf::get_labels(labels);类/结构中调用static函数时,使用Edf是正确的。

但是,对于非静态成员函数,您需要类/结构的对象实例。

例如:

Edf edf; // Of course I don't actually know if this class is default constructible
edf.get_labels(labels);

虽然类似上面的代码示例将解决编译错误,但实际上不太可能解决您的问题(即,默认构造的对象实例可能无法获取您尝试检索的标签)。

也许Edf类的实例需要作为参数传递给resample_edf函数?

从您的评论中可以看出resample_edfEdf的成员函数。

bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                  long out_freq_a)
{
    // ...

    // Just call your other member functions directly since `this` is an instance
    // of the `Edf` object
    get_labels(labels);

    // ...
}

答案 1 :(得分:1)

您说您正在将代码移动到类中的新方法,但该方法是免费的(它不属于Edf类。)使用以下命令使其属于Edf类:

bool Edf::resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                  long out_freq_a)

并确保将此函数原型添加到问题中未显示的class Edf {...}定义中,但假定存在。

这样的东西
class Edf
{
//...
bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                      long out_freq_a);
//...
};

您可能会丢失函数定义中的所有Edf::

我还注意到您在/n

中使用\n代替fprintf