代码中的两个主要类是TestVm和TestLocalQueue。 LocalQueue拥有一个队列,并提供put方法来向队列添加内容。
这是我的代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <map>
using namespace std;
class ERBaseEventType {
public:
ERBaseEventType();
string dynamic;
void setDynamic(string );
string getDynamic();
};
ERBaseEventType::ERBaseEventType() {
}
void ERBaseEventType::setDynamic(string ndynamic){
dynamic=ndynamic;
}
string ERBaseEventType::getDynamic(){
return dynamic;
}
class BaseEventType : public ERBaseEventType {
public:
BaseEventType();
};
BaseEventType::BaseEventType() {
}
class ControlCommand : public ERBaseEventType{
public:
ControlCommand();
};
ControlCommand::ControlCommand() {
}
class LocalQueue {
// static const int ENDLEN =100;
string name;
ERBaseEventType * queue[100]; // holds the queue
int head, tail; // indices of head and tail
bool lock;
public:
void init(); // initialize
// store
void put(ControlCommand * );
void print();
};
void LocalQueue::init()
{
head = tail = 0;
cout<<"tail value is "<<tail<<endl;
cout<<"head value is "<<head<<endl;
}
void LocalQueue::put(ControlCommand * mb )
{
if(tail+1==head || (tail+1==100 && !head)) {
cout << "Queue is full\n";
lock=false;
return;
}
if(tail == 100)
tail = 0; // cycle around
queue[tail] = mb;
cout << "Added to the queue tail is "<<tail<<endl;
cout << "Address is "<<queue+tail<<endl;
tail++;
}
void LocalQueue::print(){
std::cout<<"\nprint :";
std::cout<<tail;
for(int q=0;q<tail;q++){
cout << "\nAddress is "<<queue+q<<endl;
string ntdynamicContext=queue[q]->getDynamic();
std::cout<<ntdynamicContext;
}
}
class TestLocalQueue {
private:
LocalQueue * localQueue;
public:
TestLocalQueue(LocalQueue *);
void putMsg();
virtual ~TestLocalQueue();
};
TestLocalQueue::TestLocalQueue(LocalQueue * lq) {
localQueue=lq;
}
void TestLocalQueue::putMsg(){
ControlCommand * cd =new ControlCommand;
cd->setDynamic("alpha");
localQueue->put(cd);
localQueue->print(); //-----> prints the content
// delete cd;
}
TestLocalQueue::~TestLocalQueue() {
}
class TestVM {
public:
static LocalQueue localQueue;
void addMessage();
void print();
TestVM();
virtual ~TestVM();
};
LocalQueue TestVM::localQueue;
TestVM::TestVM() {
localQueue.init();
cout<<"localQueue initialized \n"<<endl;
}
void TestVM::addMessage(){
TestLocalQueue t(&localQueue);
t.putMsg();
}
void TestVM::print(){
localQueue.print();
}
TestVM::~TestVM() {
}
int main(){
TestVM v;
v.addMessage();
cout<<"\nprinting from main \n"<<endl;
v.print(); //-----> does not print the content
}
问题:
我将引用传递给&#34; localQueue&#34;从TestVM到TestLocalQueue,并使用该引用将内容添加到localQueue(putMsg())。在TestLocalQueue中,我可以在调用print putMsg()时访问添加的内容。但是当我尝试从TestVM访问localqueue时(正如我在代码中标记的那样)我无法获取内容。
抱歉代码太多了。我试图简化它。
答案 0 :(得分:2)
这很糟糕:
void TestLocalQueue::putMsg(){
ControlCommand cc;
cc.setDynamic("target");
cout<<"Setting Dynamic context \n"<<endl;
localQueue->put(&cc );
localQueue->put
函数存储您将其指向队列的指针。
但cc
的生命周期仅适用于putMsg
函数的持续时间,因此当此函数退出时,您将有一个悬空指针。
要解决此问题,您可以让队列存储对象的副本,也可以动态分配cc
。