0

我对 c++ Gui 完全陌生。我正在尝试制作一个简单的窗口表单来利用我的餐饮哲学家信号量解决方案

我的信号量头文件

ref class sema4
{
 private:
  int sem_value;
  queue Waiting_List;
 public:
  sema4();
  void wait(HANDLE h);
  void signal();
};

我的信号量 cpp

sema4::sema4()
{
 sem_value=1;
}

//suspend the thread 
void sema4::wait(HANDLE h)
{
 sem_value = sem_value - 1;
 if (sem_value < 0)
  {
    Waiting_List.enqueue(h);
    SuspendThread(h);
  }
}

//Resume the thread
void sema4::signal()
{
  sem_value = sem_value + 1;
  if (sem_value <= 0)
   {
    ResumeThread(Waiting_List.dequeue());
   }
}

我的队列头文件

ref class queue
{
 private:
  HANDLE list[20];
  int front;
  int rear;

 public:
  queue();
  void enqueue(HANDLE x);
  HANDLE dequeue();
  bool isempty();
  bool isfull();
 };

队列 CPP

queue::queue()
{
  front=-1;
  rear=-1;
}


void queue::enqueue(HANDLE x)
{
  if(isfull())
   {
     cout<<"queue is full";
   }
 else
  {
    if(front==-1)
            front=0;

    rear=(rear+1)%20;
    list[rear]=x;
  }
} 


bool queue::isfull(){
  if (front==(rear+1)%20)
        return true;
  return false;
}


HANDLE queue::dequeue(){
  if(isempty())
   {
      cout<<"queue is empty";
      return NULL;
   }
  else
   {
    HANDLE x =alist[front];
    if (front==rear)
        front=rear=-1;
    else front = (front + 1) % 20;
   }
 }

bool queue::isempty()
{
  if((front == rear) && (rear == -1))
  {
    return true;
  }
return false;
}

我不断收到错误 C4368:无法将“列表”定义为托管“队列”的成员:不支持混合类型,并且我没有使用 C++ Windows 窗体的实际经验

4

1 回答 1

2

简单的答案

您得到的编译错误是因为queue是托管类型。托管类型需要用 声明^,并使用gcnew.

更复杂的答案

您正在编写的不是 C++ 代码。这是一种称为 C++/CLI 的语言,旨在用于 .Net 托管语言(例如 C#)和非托管语言(例如 C 和 C++)之间的互操作。因此,它具有 C++ 的所有复杂性、C# 的所有复杂性,以及它自己的一些额外的复杂性。

当您刚刚学习时,请选择其中一个,然后继续。如果您想编写托管代码,请学习 C#。如果您想编写非托管代码,请学习 C++。不要在你还在学习的时候处理 C++/CLI。

于 2016-05-06T01:39:55.727 回答