c++ - 更新类变量或从成员变量调用类函数会产生运行时错误

标签 c++ oop c++11

我正在尝试实现更新,它将更新到所有监听器类 我正在使用类变量来计算听众的数量。 MyClass 正在扩展监听器以从updater

监听

当我尝试使用来自成员函数的类函数更新类变量时出现运行时错误。请引用下面的代码并帮助我解决这个问题

 #define MAX_LISTNERS 10
class Listner{
public: 
virtual void onUpdate() = 0;
};
class Updater {
    Listner* ptrListner[MAX_LISTNERS];
    static int count;
    public: 
     static void updateCount(){
        count++;
    }
    void registerListner(Listner* ptrListner){
        this->ptrListner[count] = ptrListner;
        this->updateCount(); //---> Runtime Error
    }
    void updateToListner(){
        for(int i=0;i<=count;i++){
        this->ptrListner[i]->onUpdate();
        }
    }
};
 int  Updater::count = 0;
class MyClass: public Listner{
    public:
     void onUpdate(){
        cout<<"update from MyClass";
     }
};  
class MyClass2: public Listner{
    public:
     void onUpdate(){
        cout<<"update from MyClass2";
     }};
int main() {
    MyClass* obj = new MyClass();
    MyClass2* obj2 = new MyClass2();
    Updater obj_updater;
    obj_updater.registerListner(dynamic_cast<Listner*>(obj));
    obj_updater.registerListner(dynamic_cast<Listner*>(obj2));
    obj_updater.updateToListner();
}

最佳答案

这里需要考虑一些事情,因为这似乎有点不安全,而且不符合现代 C++11 的方式。

  1. 使用 RAII 进行分配,即 unique_ptr 而不是显式新建/删除
  2. 使用 std::vector 代替 C 风格的数组声明。您可以在运行时限制数量。这也为您提供了隐含的听众数量
  3. 让 Updater 类负责分配、工厂风格,这也让您尊重类型安全

类似下面的内容:

class Listner
{
    public:
        virtual void onUpdate() = 0;
};

class Updater
{
    using ListnerPtr = std::unique_ptr<Listner>;
    using Listners   = std::vector<ListnerPtr>;

    Listners m_listeners;

public:
    template < typename T >
    bool registerListner()
    {
        static_assert(std::is_base_of<Listner, T>::value, "T must be derived from Listner");

        if (m_listeners.size() >= 10)
            return false;

        m_listeners.emplace_back(std::make_unique<T>());
        return true;
    }

    void updateToListner()
    {
        std::for_each(m_listeners.begin(), m_listeners.end(), [](const Listners::value_type& item)
        {
            item->onUpdate();
        });
    }
};

class MyClass : public Listner
{
public:
    void onUpdate() override
    {
        std::cout << "update from MyClass" << std::endl;
    }
};

class MyClass2 : public Listner
{
public:
    void onUpdate() override
    {
        std::cout << "update from MyClass2" << std::endl;
    }
};

int main
{
    Updater obj_updater;
    obj_updater.registerListner<MyClass>();
    obj_updater.registerListner<MyClass2>();
    obj_updater.updateToListner();
    return 0
}

关于c++ - 更新类变量或从成员变量调用类函数会产生运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48945234/

相关文章:

c++ - 为什么 std::num_put 通过非 const 引用获取 ios_base 参数?

c# - 声明连接变量

c# - 泛型实现中的值和引用类型

javascript - 如何运行一个对象的多个实例

C++ std::sort() 调用析构函数

c++ - main() 在 C 和 C++ 中应该返回什么?

php - PHP 中 $this->$variable 语法不明确

c++ - 可变参数模板函数:没有匹配的调用函数,std::endl

c++ - 对 openmp C++ 中的一些嵌套进行并行化

c++ - 它们的表示是它们与 C++ 具体类型相关的定义的一部分?