gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:47:43 25 4
gpt4 key购买 nike

我正在尝试实现更新,它将更新到所有监听器类我正在使用类变量来计算听众的数量。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/

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