是否可以使用指向未实例化对象的指针作为C ++中的变量?

西亚兰·威尔士

我希望C ++类中的属性是特定类的未实例化的类。然后,此类的所有成员都将实现相同的方法,这意味着我可以实例化该对象,然后在情况需要时使用该方法。这是一些代码(未编译),说明了我的意思:


#include <iostream>

using namespace std;

class Event {
public:
    Event() = default;
    virtual void go() = 0;
};

class EventA : Event {
public:
    EventA() = default;

    void go(){
        cout << "Running event A"<< endl;
    }
};

class EventB : Event {
public:
    EventB() = default;


    void go(){
        cout << "Running event B"<< endl;
    }
};

class Situation{
private:
    Event* current_event = &EventA;   //Problematic code: EventA does not refer to a value
public:
    Situation() = default;

    void setEvent(Event* event){
        current_event = event;
    }

    void runEvent(){
        current_event.go();
    }
};

int main() {

    Situation situation;
    situation.runEvent();
    situation.setEvent(&EventB);
    situation.runEvent();

    return 0;
};

吕韦拉

在两个地方,您似乎正在做可以描述为试图从类型中获取指针的操作:

Event* current_event = &EventA;

situation.setEvent(&EventB);

这是行不通的,在C ++中并不是真正意义上的东西。我想的可以通过3种不同的方式来实现。

方法1:您可以拥有一个函数指针,然后将函数指针作为参数传递:

#include <iostream>

using namespace std;

void eventA_go(){
    cout << "Running event A"<< endl;
}

void eventB_go(){
    cout << "Running event B"<< endl;
}

class Situation{
private:
    using EventFunctionPtr = void (*)();
    EventFunctionPtr current_event = &eventA_go;
public:
    Situation() = default;

    void setEvent(EventFunctionPtr event){
        current_event = event;
    }

    void runEvent(){
        current_event();
    }
};

int main() {

    Situation situation;
    situation.runEvent();
    situation.setEvent(&eventB_go);
    situation.runEvent();

    return 0;
};

方法2:您可以通过允许类中的任何类型的可调用Situation项(不仅是函数指针),使此代码更通用一些

#include <iostream>
#include <functional>

using namespace std;

void eventA_go(){
    cout << "Running event A"<< endl;
}

void eventB_go(){
    cout << "Running event B"<< endl;
}

class Situation{
private:
    std::function<void ()> current_event = eventA_go;
public:
    Situation() = default;

    template <typename F>
    void setEvent(F&& event){
        current_event = event;
    }

    void runEvent(){
        current_event();
    }
};

int main() {

    Situation situation;
    situation.runEvent();
    situation.setEvent(&eventB_go);
    situation.runEvent();

    return 0;
};

方法3:您可以回到最初的想法,即必须实现一个基类才能提供go()方法,但是在这种情况下,您实际上必须确保所调用的对象确实存在。一种可能的方法是std::unique_ptr

#include <iostream>
#include <memory>

using namespace std;

class Event {
public:
    Event() = default;
    virtual ~Event() = default;
    virtual void go() = 0;
};

class EventA : public Event {
public:
    EventA() = default;

    void go(){
        cout << "Running event A"<< endl;
    }
};

class EventB : public Event {
public:
    EventB() = default;

    void go(){
        cout << "Running event B"<< endl;
    }
};

class Situation{
private:
    std::unique_ptr<Event> current_event = std::make_unique<EventA>();
public:
    Situation() = default;

    void setEvent(std::unique_ptr<Event>&& event){
        current_event = std::move(event);
    }

    void runEvent(){
        current_event->go();
    }
};

int main() {

    Situation situation;
    situation.runEvent();
    situation.setEvent(std::make_unique<EventB>());
    situation.runEvent();

    return 0;
};

请注意,在这种情况下,抽象类的析构函数必须是virtual,继承必须是公共的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以获取Java中未实例化变量的类型?

来自分类Dev

我可以使用“ using”代替“ typedef”作为指向类成员变量的指针吗?

来自分类Dev

当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

来自分类Dev

是否可以序列化包含BufferedImage的对象的ArrayList作为Java中对象的私有实例变量之一?

来自分类Dev

我可以使用变量的值作为C#中对象的名称吗

来自分类Dev

是否可以在C ++中显式实例化临时变量?

来自分类Dev

我可以使用带有C ++ 17的std :: any指向成员变量的指针吗?

来自分类Dev

在Rust中可以使用指向临时对象的原始指针吗?

来自分类Dev

是否可以使用ansible在变量中设置变量?

来自分类Dev

是否可以将JSON对象用作Activiti中的变量,并使用特定的节点作为变量

来自分类Dev

指向systemctl以使用文件中的变量

来自分类Dev

是否可以使用C#中定义的对象作为使用R.NET的R函数/命令的输入

来自分类Dev

在Ansible中,是否可以使用变量名作为值?

来自分类Dev

在Sass中,是否可以使用选择器值作为变量

来自分类Dev

是否可以使用linq(查询语法)中的范围变量作为参数?

来自分类Dev

指针指向未初始化的变量

来自分类Dev

目标C对象作为C ++类中的实例变量

来自分类Dev

C 中的指针变量

来自分类Dev

子函数中是否可以使用局部变量?

来自分类Dev

PHP 中是否可以使用变量的值反斜杠?

来自分类Dev

在授权载体中是否可以使用变量代替令牌?

来自分类Dev

是否可以在C ++中创建指向类的指针

来自分类Dev

在Firebase中是否可以对包含对象作为变量的对象进行序列化和反序列化?

来自分类Dev

在纯 C 中,我们可以使用指向 char 的指针而不是指向 void 的指针来实现泛型函数吗?

来自分类Dev

是否可以使用查询键参数作为变量?

来自分类Dev

是否可以使用 xsl:number 作为变量?

来自分类Dev

在 C 中初始化指向常量对象的常量指针

来自分类Java

在Java中,是否可以使用“原始未参数化的类” -es而不是使用虚拟接口?

来自分类Dev

在C ++中,类是否可以包含指向构造函数中初始化的同一类的指针?

Related 相关文章

  1. 1

    是否可以获取Java中未实例化变量的类型?

  2. 2

    我可以使用“ using”代替“ typedef”作为指向类成员变量的指针吗?

  3. 3

    当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

  4. 4

    是否可以序列化包含BufferedImage的对象的ArrayList作为Java中对象的私有实例变量之一?

  5. 5

    我可以使用变量的值作为C#中对象的名称吗

  6. 6

    是否可以在C ++中显式实例化临时变量?

  7. 7

    我可以使用带有C ++ 17的std :: any指向成员变量的指针吗?

  8. 8

    在Rust中可以使用指向临时对象的原始指针吗?

  9. 9

    是否可以使用ansible在变量中设置变量?

  10. 10

    是否可以将JSON对象用作Activiti中的变量,并使用特定的节点作为变量

  11. 11

    指向systemctl以使用文件中的变量

  12. 12

    是否可以使用C#中定义的对象作为使用R.NET的R函数/命令的输入

  13. 13

    在Ansible中,是否可以使用变量名作为值?

  14. 14

    在Sass中,是否可以使用选择器值作为变量

  15. 15

    是否可以使用linq(查询语法)中的范围变量作为参数?

  16. 16

    指针指向未初始化的变量

  17. 17

    目标C对象作为C ++类中的实例变量

  18. 18

    C 中的指针变量

  19. 19

    子函数中是否可以使用局部变量?

  20. 20

    PHP 中是否可以使用变量的值反斜杠?

  21. 21

    在授权载体中是否可以使用变量代替令牌?

  22. 22

    是否可以在C ++中创建指向类的指针

  23. 23

    在Firebase中是否可以对包含对象作为变量的对象进行序列化和反序列化?

  24. 24

    在纯 C 中,我们可以使用指向 char 的指针而不是指向 void 的指针来实现泛型函数吗?

  25. 25

    是否可以使用查询键参数作为变量?

  26. 26

    是否可以使用 xsl:number 作为变量?

  27. 27

    在 C 中初始化指向常量对象的常量指针

  28. 28

    在Java中,是否可以使用“原始未参数化的类” -es而不是使用虚拟接口?

  29. 29

    在C ++中,类是否可以包含指向构造函数中初始化的同一类的指针?

热门标签

归档