【问题标题】:C++: Calling object dependent methods within another methodC++:在另一个方法中调用对象相关方法
【发布时间】:2016-11-04 03:55:18
【问题描述】:

我正在努力将一些处理从 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 类非常大,因此很难为您提供全部内容。

如果原帖不清楚,请见谅。

【问题讨论】:

  • 创建Edf 的实例?或者声明函数static?只是列出一些方法:)
  • Find a beginners book 并重新学习类和对象之间的交互方式以及类和对象之间的区别。

标签: c++ class object methods


【解决方案1】:

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

error: cannot call member function ... without object

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

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

例如:

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);

    // ...
}

【讨论】:

  • 我认为将对象传递给方法也可以,但我不确定是否有解决此问题的方法,因为该方法仍然被对象调用。跨度>
  • @JamesMchugh resample_edfEdf 类/结构的一部分吗?如果是这样,那就很重要了。正如所发布的,resample_edf 看起来像是一个免费功能。
  • 是的,问题与我发布此问题时遇到的问题相同。我忘了放`bool Edf::resample_edf(...)'。谢谢。
【解决方案2】:

您说您正在将代码移动到类中的新方法,但该方法是免费的(它不属于 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::

我还注意到您在fprintf 中使用了/n 而不是\n

【讨论】:

  • 这正是我忘记的。有时你只需要另一双眼睛就能发现这样的愚蠢错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多