【问题标题】:CXX0030 Expression cannot be evaluatedCXX0030 无法评估表达式
【发布时间】:2013-07-18 20:42:20
【问题描述】:

我在这里有一个误解。我正在设计一个使用 Client 类作为基本单元的 Queue 类。列表结构由指向下一个数据的指针和用于保存客户端对象的变量组成。

Queue 类有 2 种操作方式。它的运行方式由 bool MODE 变量决定。如果 mode 等于 1,则 Queue 类使用放置 new 运算符,如果不是,则使用 new 运算符。

这是 Queue 类的原型:

class Queue
{
private:
    const int max_lists;
    int no_lists, counter;
    char client_value;
    list *chunk; 

    list *top;
    const bool MODE;
    void addFirst(const Client &c);
    void addLast(const Client &c); 
    void deleteLast();
    void deleteFirst();

    void clean_mem();
    void clean_mem(list *&pos);
    list* malloc();//T* type
public:
    Queue();
    Queue(list *buffer,int no);
    Queue(const Queue &q);
    Queue& operator=(const Queue &q);
    ~Queue() { clean_mem(); }

    void enqueue(const Client &c);
    void timeoutCustomers();
    void decreaseTimeout();
    Client getCustomer() const;
    void finishCustomer();

    void show() const;
};

导致错误的函数定义在这里:

void Queue::addFirst(const Client &c)
{
    if(top==nullptr)
    {
        top = malloc();
        top->info = c;
        top->next = nullptr;
    }
    else
    {
        list *add = malloc();
        add->info = c;
        add->next = top;
        top = add;
    }
}


list* Queue::malloc()
{
    if(MODE)
    {
        if(no_lists==max_lists)
        {
            return nullptr;
        }
        else
        {
            list *tmp = chunk;
            counter = 0;
            while(counter++<max_lists)
            {
                 client_value = (char)tmp->info;
                 if(client_value==-1 && tmp->next==nullptr)
                 {
                     return new(tmp) list;
                 }
                 tmp++;
             }
             return nullptr;
         }

     }
    else
    {
         return new list;
    }
}

这是列表结构:

struct list { Client info; list *next; };

当我创建 Queue 类的实例时,我可以选择是继续放置 new 还是仅使用 new 运算符。

如果我选择新的展示位置,我必须发送列表类型数组的地址。地址被保存到块指针中。顶部指针保存链表的首地址。 然后,如果我调用 addFirst() 函数,它会在 top->info = c 处停止。错误指向 top->info :

 CXX0030: Error: Expression cannot be evaluated.

但是当我切换回新的运营商时,一切正常。这告诉我在已分配的内存中分配新部分存在问题。

谁能告诉我这里有什么问题?

【问题讨论】:

  • 您确定您复制的代码正确吗?我在您的 malloc 定义中看到了一些选项卡格式问题,并且该函数没有右括号。
  • 我已经更正了标签格式问题。
  • 我不知道为什么会编译,但我会通过在你的 malloc 函数上放置一个右括号来解决它。
  • 现在看起来更加混乱了,你的 malloc 函数现在在函数定义之后有一个 else 块(我认为这应该是不可能的)并且并非所有控制路径都返回一个值。
  • 如果将 malloc 重命名为其他名称会怎样?将某物定义为宏的可能性很小但非零。

标签: c++ class pointers placement-new


【解决方案1】:

您是否打算使用这样的 malloc 函数?在您的函数定义之后,您有一个“else”块,并且并非所有控制路径都返回一个值。我在这里进行了重写,似乎更符合我认为您的实际意图:

list* Queue::malloc()
{
    if(MODE)
    {
        if(no_lists==max_lists)
        {
            return nullptr;
        }
        else
        {
            list *tmp = chunk;
            counter = 0;
            while(counter++<max_lists)
            {
                client_value = (char)tmp->info;
                if(client_value==-1 && tmp->next==nullptr)
                {
                    return new(tmp) list;
                }
                tmp++;
            }
            return nullptr;
        }
    }
    else
    {
        return new list;
    }
}

【讨论】:

  • 谢谢。这就是我的意图。
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多