C++;:在另一个方法中调用依赖对象的方法 我正在把一些处理从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(); ...

C++;:在另一个方法中调用依赖对象的方法 我正在把一些处理从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(); ...,c++,class,object,methods,C++,Class,Object,Methods,get\u labels(labels)、get\u duration()和get\u sample\u 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);

get\u labels(labels)
get\u duration()
get\u sample\u 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))
  }
...
//本地包含文件
//
#包括
...
int main(int argc,常量字符**argv){
...
//创建一个Edf对象
//
Edf Edf(Edf::无级);
//对信号重新采样
//
如果(!edf.重采样edf(信号输入、信号输出、输出频率)){
fprintf(标准输出,“**>nedc\u重采样\u edf:错误重采样信号\n”);
返回((状态=-1))
}
...
重采样\u edf方法是edf对象中的一种方法。现在,在该方法中,我希望能够从该对象调用其他方法,但这样做会出错。在此方法中重新实例化edf对象对我没有帮助。我尝试了多种方法,但没有任何效果

我最初没有包括实用程序的运行方式,因为类的编译与实用程序无关。问题在于该方法如何从同一对象调用其他方法。Edf类非常大,因此很难为您提供全部内容


如果原始帖子不清楚,很抱歉。

您没有向我们显示
Edf
class/struct,但是错误消息非常清楚

错误:无法调用没有对象的成员函数

调用
Edf
class/struct中的
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\u Edf
函数


从您的评论中,听起来像是
重新采样\u edf
edf
的一个成员函数

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

    // ...
}

您没有向我们显示
Edf
class/struct,但是错误消息非常清楚

错误:无法调用没有对象的成员函数

调用
Edf
class/struct中的
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\u Edf
函数


从您的评论中,听起来像是
重新采样\u edf
edf
的一个成员函数

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

    // ...
}

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

bool Edf::resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                  long out_freq_a)
并确保将此函数原型添加到
类Edf{…}
定义中,该定义未在问题中显示,但假定存在

差不多

class Edf
{
//...
bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                      long out_freq_a);
//...
};
您可能会丢失函数定义中的所有
Edf::


我还注意到,您在
fprintf

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

bool Edf::resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                  long out_freq_a)
并确保将此函数原型添加到
类Edf{…}
定义中,该定义未在问题中显示,但假定存在

差不多

class Edf
{
//...
bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a,
                      long out_freq_a);
//...
};
您可能会丢失函数定义中的所有
Edf::


我还注意到,您在
fprintf

中使用了
/n
而不是
\n
,创建了
Edf
的一个实例,或者声明了
static
?只列出了一些方法:)并重新学习类和对象之间的交互方式以及类和对象之间的区别Edf的ce
?或声明函数
静态?仅列出一些方法:)并重新学习类和对象之间的交互方式以及类和对象之间的区别。我认为将对象传递给方法也会起作用,但我不确定是否有办法解决此since该方法仍被该对象调用。@JamesMchugh是
重采样edf
类/结构的一部分吗?如果是,这很重要。如前所述,
重采样edf
看起来像一个自由函数。是的,问题是相同的