saide_a Ответов: 3

Назначить константные функции в другую функцию как const


как я могу назначить функции константные функции константные члены класса
аналогично следующему примеру:

Что я уже пробовал:

<pre>class test
{
	test();
	const int y1(char i)	
	{
		cout<< i;
	}
}
const int y2(char i);
test::test()
{
	y2(char i) = &y1;
}

3 Ответов

Рейтинг:
27

CPallini

С тех пор как ваш y1 не имеет доступа ни к одному члену группы. test затем вы можете изменить его так, чтобы он был static и писать

#include <iostream>
using namespace std;

const void (*y2)(char i);

class test
{
  static const void  y1(char i)
  {
    cout << i << "\n";
  }

public:
  test();
};

test::test()
{
  y2 = &y1;
}

int main()
{
  test t;
  y2('F');
}


Соответствующий код для обычного (нестатического) метода будет выглядеть следующим образом
#include <iostream>
using namespace std;

class test;

const void (test::*y2)(char i);

class test
{
  const void  y1(char i)
  {
    cout << i << "\n";
  }

public:
  test();
};

test::test()
{
  y2 = &test::y1;
}

int main()
{
  test t;
  (t.*y2)('F');
}


Обратите внимание, что в обоих случаях код, хотя и работает, довольно бессмыслен.


Рейтинг:
1

OriginalGriff

Вы не можете предоставить функцию левой части назначения: она не является изменяемой lvalue если только функция не возвращает ссылку:

Значения lvalue следующие типы объектов не могут быть изменены значения lvalue:
An array type
An incomplete type
A const-qualified type
A structure or union type with one of its members qualified as a const type

Поскольку эти значения lvalues не поддаются изменению, они не могут отображаться в левой части инструкции присваивания


Рейтинг:
0

Richard MacCutchan

Этот код не имеет большого смысла. Вы заявили: y1 как const int, но это ничего не возвращает. В вашем test конструктор вы пытаетесь сделать присвоение непереставляемому имени. Вам нужно будет сделать y2 указатель функции для достижения того, что вы хотите.