1
class OSwitch {
private:
    Operator *operators[];
    //int variable; <-- unused variable

public:
    OSwitch() {}
    ~OSwitch() {}

void setOperator(int id, Operator *op) {
    operators[id] = op;
}

void execute(int id) {
    operators[id]->execute();
}

};

抽象基类 Operator 有几个子类。当多次调用 setOperator() 时,数组“忘记”最后一个元素。

例如

XOperator a;
YOperator b;
os.setOperator(1,a);
os.setOperator(2,b);
os.execute(1); // <- wont work

但是当声明 int 变量(或 OperatorSwitch 中的任何其他变量)时,它就可以工作。我不知道这是如何工作的。

感谢您的任何提示。

4

3 回答 3

1

数组operators没有声明大小。要么声明数组中元素的数量,如 in operators[10],要么std::vector改用。

于 2012-05-20T18:46:46.260 回答
1

您的成员变量operators是一个未调整大小的数组,它是不完整的类型,并且不允许在类定义中使用。

您可能想要的是整数到指针的映射:

#include <map>

class OSwitch
{
private:
    std::map<int, Operator *> operators;
public:
    void setOperator(int id, Operator *op) { operators[id] = op; }
    void execute(int id) { operators[id]->execute(); }
};

请注意,调用execute尚未分配有效指针的 ID 将是错误的。您可以通过首先检查地图元素的存在来使其更加健壮。

于 2012-05-20T18:56:23.000 回答
0

您需要在添加数据之前初始化数组。我建议你在这个数组中使用值,而不是指针,因为这样你就不会遇到定义谁将在Operator*之后删除 s 的问题(即 or 的调用者setOperator~OSwitch()

于 2012-05-20T18:51:45.717 回答