C 错误:在自定义类的构造函数呼叫期间使用已删除的函数
C++ Error: use of deleted function during constructor call of custom class
我有一个自定义类producer
,该类别从Systemc类sc_module
继承:
class producer: public sc_module {
public:
int counter;
sc_in<bool> clock;
sc_out<msg> out;
int speed;
producer(sc_module_name name, int speed) :
sc_module(name),
speed(speed)
{
SC_HAS_PROCESS(producer);
SC_METHOD(produce);
sensitive << clock.pos();
counter = 0;
}
void produce() {
...
}
};
SystemC sc_main
-类别的后期我想在std::vector<producer>
中放一堆对象:
std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
producers.at(i) = producer("Producer " + i, genSpeed); // <- Here the error occurs
}
这是编译器错误:
error: use of deleted function ‘producer& producer::operator=(producer&&)’
producers.at(i) = producer("Producer " + i, genSpeed);
^
dist.cpp:103:7: note: ‘producer& producer::operator=(producer&&)’ is implicitly deleted because the default definition would be ill-formed:
class producer: public sc_module {
^~~~~~~~
为什么发生错误?我该如何修复?
sc_module
s禁用复制构造和分配,以实现/保存systemc详细语义。
您应该使用sc_vector
创建sc_object
s的集合。它是专门为解决此类设计问题而创建的。
producer
没有移动分配运算符。从外观上看,可能是因为sc_module
没有一个。
您还有其他问题:
std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
producers.at(i) ....
}
这将创建一个producers
的空矢量,然后分配给该向量的第一个元素。问题在于没有这样的元素,并且由于您使用的是at
,您会得到例外。
方便地,您可以通过以下方式立即解决这两个问题
std::vector<producer> producers;
for(int i = 0; i < numIn; i++){
producers.emplace_back("Producer " + i, genSpeed);
}
这会创建一个空的向量,然后在其末端构造一系列新的producer
s。这确实取决于您具有工作的移动构造函数。如果您没有工作的移动构造函数,我认为您会被卡住。
这仍然行不通,因为您会让制作人称为"生产者"," Roducer"," Oducer"等。将整数添加到字符字符串字面的字符串中,只会将指针返回到指针字面意思。您需要的是使文字成为std::string
字面的文字,然后将整数转换为文本。
producers.emplace_back("Producer "s + std::to_string(i), genSpeed);
i我们的最终解决方案我们使用了std::shared_ptr
和std::vector
:
using sharedProducerPointer = std::shared_ptr<producer>;
std::vector<sharedProducerPointer> producers;
//bind producers and distributor to input signals
for(int i = 0; i < numIn; i++) {
std::string stringProducersName = "producer_" + std::to_string(i);
const char* charProducersName = stringProducersName.c_str();
sharedProducerPointer prod = sharedProducerPointer(new producer(charProducersName, genSpeed, numOut));
prod->out.bind(inputSignals.at(i));
dist.inputMsg.at(i).bind(inputSignals.at(i));
prod->clock(inClock);
producers.push_back(prod);
}
相关文章:
- 如何通过 getter 函数删除矢量的元素?
- C++类析构函数删除成员(如果"owner"?
- 使用私有析构函数删除动态分配的对象
- C ++(为什么)确实移动构造函数删除运算符=
- 析构函数删除错误的元素
- C++ 类析构函数删除部分但不是全部成员数据
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 仅仅以避免隐式复制构造函数删除,使用shared_ptr而不是unique_ptr作为类成员明智
- 析构函数删除在 main 中声明的动态数组
- 如果未分配申报表,是否需要删除或处理动态数组?还是它被函数删除
- C++ 函数删除一行
- g++空函数删除是否递归工作
- C++析构函数删除东西(对象,指针?)太快
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- C++11 析构函数 = 删除
- 父类析构函数删除具有外部启动元素的子类
- 函数删除太多
- C++析构函数删除共享内存
- C++,如何让此函数删除存储在数组中的字符串
- 析构函数删除数组时出错