gpt4 book ai didi

c++ - 在 C++ 中使用函数指针成员初始化结构数组

转载 作者:行者123 更新时间:2023-11-28 02:25:19 32 4
gpt4 key购买 nike

我在使用函数指针作为其中的成员初始化结构数组时遇到问题。

class Record
{
private:
typedef void (*display_fn_t) ();
struct record {
int a;
display_fn_t disp;
};
static const record rec[];

void disp1() { cout << "Display 1 with a string to display" << endl; }
void disp2() { cout << "Display 2 with an integer to display" << endl; }

public:
int find() { /* logic to find the record comes here */ }
void display() {
for (int i = 0; i < 2; i++) {
rec[i].disp();
}
}
}

const Record::record Record::rec[] = {
{ 10, disp1 },
{ 11, disp2 }
};

int main()
{
Record r;
if (r.find())
r.display();
return 0;
}

当我编译上面的代码时,出现以下编译错误:

mca_record.cpp:56: error: argument of type ‘void (Record::)()’ does not match ‘void (*)()’

最佳答案

您的语法错误,未使用适当的运算符。

修复了大量的语法错误,并去除了不相关的find 操作,然后利用适当的成员函数指针和operator ->* 给出了以下(几个之一方法):

#include <iostream>

class Record
{
private:
typedef void (Record::*display_memfn_t)();
struct record
{
int a;
display_memfn_t disp;
};

static const record rec[];

void disp1() { std::cout << "Display 1 with a string to display" << std::endl; }
void disp2() { std::cout << "Display 2 with an integer to display" << std::endl; }

public:
void display();
};

const Record::record Record::rec[] =
{
{ 10, &Record::disp1 },
{ 11, &Record::disp2 }
};

void Record::display()
{
for (size_t i=0; i<sizeof rec/sizeof*rec; ++i)
(this->*(rec[i].disp))();
}

int main()
{
Record r;
r.display();
return 0;
}

输出

Display 1 with a string to display
Display 2 with an integer to display

将它与您现有的代码进行比较,特别是指向成员函数的指针不仅仅是指向函数的指针。它们需要不同的处理和通常不同的运算符(operator)来使用。 See here对于不同的成员访问方法(变量和函数)。

祝你好运。

关于c++ - 在 C++ 中使用函数指针成员初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30907252/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com