【问题标题】:What am i doing wrong here? Defining a class with a pointer to function typedef.我在这里做错了什么?使用指向函数 typedef 的指针定义一个类。
【发布时间】:2013-06-17 04:38:55
【问题描述】:

这是我的代码:

// WorkDamnit.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


class Scheduler
{

public:

    typedef void (*function_ptr) (void); 

    struct Task
    {
        function_ptr    function; 
        int             numOfTasks;
    };

    void Init(Task *tasks, int numOfTasks); 



private: 
    int     _numOfTasks; 
    Task    *_tasks; 

};

void Scheduler::Init(Scheduler::Task *tasks, int numOfTasks)
{
    _tasks = tasks; 
    _numOfTasks = numOfTasks;
}


void count() {}; 



Scheduler::Task task_list = 
{
    count, 1
}; 


Scheduler scheduler; 

Scheduler.Init(Scheduler::Task &task_list,1); 

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

我从编译器收到以下错误:

1>c:\users\evan\documents\visual studio 2012\projects\workdamnit\workdamnit\workdamnit.cpp(49): error C2143: syntax error : missing ';' before '.'
1>c:\users\evan\documents\visual studio 2012\projects\workdamnit\workdamnit\workdamnit.cpp(49): error C2059: syntax error : '.'

编译器似乎不喜欢类对象定义之后的行。当我尝试调用 init() 成员时。我能想到的只是它与指向函数引用的指针有关。也许有人可以为我阐明这一点?

【问题讨论】:

  • Scheduler.Init(Scheduler::Task &task_list,1); 不合法。不在命名空间范围内,不在类范围内...
  • projects\ workdamnit\workdamnit\workdamnit.cpp,我喜欢它。
  • 你试图从哪里调用“Init”,你试图从哪个对象实例调用它?
  • 当你解决这个问题时(出于教育目的),使用std::function<void(void)> :)

标签: c++ class function pointers typedef


【解决方案1】:

您可以在其他方法/函数之外直接调用调用函数/方法。

Scheduler.Init(Scheduler::Task &task_list,1);

这一行有 2 个问题。 以上似乎超出了任何功能/方法。例如。你可以放在main里面。

该行本身不正确。所以改成

scheduler.Init(&task_list,1);

通常你调用对象的方法而不是类名,静态方法除外。向方法传递参数时不要传递参数类型。

所以 main 中更改的行看起来像

int _tmain(int argc, _TCHAR* argv[])

{
    scheduler.Init(&task_list,1); 

    return 0;
}

【讨论】:

  • 对不起,伙计们。我曾尝试将其作为 scheduler.Init(&task_list,1),我只是没有将它放在 main.... 我不知道这会有所作为。在 main 之外,它表示该函数没有存储类或类型说明符。谁能告诉我为什么在这种情况下在 main() 内不会引发同样的错误?
  • @EvanJ227 - 我在 main 之外尝试过,但我得到了一个不同的错误。 error C2143: syntax error : missing ';' before '.' error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C2371: 'scheduler' : redefinition; different basic types
【解决方案2】:

第 49 行应该是:

scheduler.Init(Scheduler::Task &task_list,1); // 注意小写的's':应该使用对象,而不是类

它也应该在一个函数中(在你的情况下可能是 main)

【讨论】:

  • 在函数体之外如何合法?
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多