gpt4 book ai didi

c++ - 无法在 C++ 中初始化方法指针映射

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:31 24 4
gpt4 key购买 nike

我有一个类似下面的函数:

//Parser.cpp
//...
Parser::Parser(CommandFactory & fact,
ArrayList<std::string> & expression)
{

operations["*"] = &fact.createMultiplyCommand; //error C2276
operations["/"] = &fact.createAdditionCommand; //error C2276
operations["+"] = &fact.createAdditionCommand; //error C2276
operations["%"] = &fact.createModulusCommand; //error C2276
operations["-"] = &fact.createSubtractionCommand; //error C2276

infixToPostfix(fact,expression);

}
//...

//Parser.h
//...

Parser (CommandFactory & fact,
ArrayList<std::string> & expression);

Stack<Command*> tempCommandStack;
ArrayList<Command*> postfix;

/// Destructor.
~Parser (void);

private:
//syntax is: <return_type> (*)()
//syntax for a class method is: <return_type> (<class_name> *)();
//syntax with a typedef is: typedef <return_type> (<class_name> * <typedef_name>)();
// typedef <return_type> (*<typedef_name>)()


std::map<std::string, Command * (*)()> operations;
std::map<std::string,int> precedence;
//...

了解 CommandFactory 是一个抽象类(传入的是具体的)也可能有所帮助

我收到的错误是 C2276:“&”:绑定(bind)成员函数表达式上的非法操作。

我不知道我在定义映射时究竟做错了什么。有什么想法吗?

编辑:

//CommandFactory.h
#ifndef _COMMANDFACTORY_H_
#define _COMMANDFACTORY_H_

#include "Subtract.h"
#include "Add.h"
#include "Divide.h"
#include "Multiply.h"
#include "Modulus.h"
#include "Negation.h"
class CommandFactory
{
public:

virtual Subtract * createSubtractionCommand() = 0;
virtual Add * createAdditionCommand() = 0;
virtual Divide * createDivisionCommand() = 0;
virtual Multiply * createMultiplyCommand() = 0;
virtual Modulus * createModulusCommand() = 0;
virtual Negation * createNegationCommand() = 0;
~CommandFactory(void);

};

#endif

//StackCommandFactory.h

#ifndef _STACKCOMMANDFACTORY_H_
#define _STACKCOMMANDFACTORY_H_

#include "Add.h"
#include "Subtract.h"
#include "Divide.h"
#include "Multiply.h"
#include "Modulus.h"
#include "CommandFactory.h"


class StackCommandFactory : public CommandFactory
{
public:



virtual Subtract * createSubtractionCommand(void);
virtual Add * createAdditionCommand(void);
virtual Divide * createDivisionCommand(void);
virtual Multiply * createMultiplyCommand(void);
virtual Modulus * createModulusCommand(void);
virtual Negation * createNegationCommand(void);

protected:
Subtract * sub;
Add * add;
Divide * div;
Multiply * mul;
Modulus * mod;
Negation * neg;

};

#endif // !defined _STACKCOMMANDFACTORY_H_

//StackCommandFactory.cpp
#include "StackCommandFactory.h"

Subtract * StackCommandFactory::createSubtractionCommand(void)
{
return sub;
}

Add * StackCommandFactory::createAdditionCommand(void)
{
return add;
}

Divide * StackCommandFactory::createDivisionCommand(void)
{
return div;
}

Multiply * StackCommandFactory::createMultiplyCommand(void)
{
return mul;
}

Modulus * StackCommandFactory::createModulusCommand(void)
{
return mod;
}

Negation * StackCommandFactory::createNegationCommand(void)
{
return neg;
}

最佳答案

您的代码存在一些问题。主要集中在成员函数而不是全局函数的使用上。您尝试从对象中获取成员函数,而您应该从类本身获取它们。 (即,您需要 &CommandFactory::createAdditionCommand 而不是 &fact.createAdditionCommand。)但这会导致未绑定(bind)的成员函数,这意味着您需要使用 ( fact.*fn)() - 即使用 CommandFactory 类的对象。这并不理想——也不是您想要的。您正在寻找绑定(bind)成员函数。在非 C++-11 应用程序中使用这些是可能的,但很难看。您可以使用 boost 库来真正帮助解决这个问题(除了一些 stdboost 样式更改之外,下面的代码几乎没有变化。 ) 如果您使用的是 C++-11,那么您可以使用 C++-11 函数对象。

这是从您的来源派生的完整示例:

#include <vector>
#include <map>
#include <functional>
#include <string>

struct Command {};
struct Subtract : Command {};
struct Add : Command {};

class CommandFactory
{
public:

virtual Subtract * createSubtractionCommand() = 0;
virtual Add * createAdditionCommand() = 0;
};

class StackCommandFactory : public CommandFactory
{
public:

virtual Subtract * createSubtractionCommand(void);
virtual Add * createAdditionCommand(void);

Subtract * sub;
Add * add;
};

Subtract * StackCommandFactory::createSubtractionCommand(void) { return sub; }
Add * StackCommandFactory::createAdditionCommand(void) { return add; }

class Parser
{
public:
Parser (CommandFactory & fact);

std::map<std::string, std::function<Command*()> > operations;
};

Parser::Parser(CommandFactory & fact)
{
operations["+"] = std::bind(&CommandFactory::createAdditionCommand, &fact);
operations["-"] = std::bind(&CommandFactory::createSubtractionCommand, &fact);
}

#include <iostream>
int main()
{
Add add;
Subtract sub;

StackCommandFactory command_factory;
command_factory.add = &add;
command_factory.sub= &sub;
Parser parser(command_factory);

std::cout<<"&add = "<<&add<<std::endl;
std::cout<<"Add = " << parser.operations["+"]() <<std::endl;
std::cout<<"&sub = "<<&sub<<std::endl;
std::cout<<"Sub = " << parser.operations["-"]() <<std::endl;

return 0;
}

我得到输出

&add = 0x7fff58d538d8
Add = 0x7fff58d538d8
&sub = 0x7fff58d538d0
Sub = 0x7fff58d538d0

显示通过解析器返回的 Add 对象与存储到 CommandFactory 中的对象相同。 (对于 Subtract 对象也是如此)

关于c++ - 无法在 C++ 中初始化方法指针映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15513453/

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