【问题标题】:C++ Who storing the struct in the stack (STL)C ++谁将结构存储在堆栈中(STL)
【发布时间】:2015-04-15 18:46:41
【问题描述】:

我有一个这样的问题: C++: Storing structs in a stack

我的代码:

#include <stdio.h>
#include <stack>
#include <iostream>
#include <string>
using namespace std;

struct adresse{

    string info;
};

int main(){

    string eingabe;
    stack<adresse> Stack1;

    cout << "Bitte Ausdruck eingeben: " << endl;
    getline( cin, eingabe);

    adresse* temp;
    temp = new adresse;
    temp->info = eingabe[0];
    Stack1.push(temp);

    return 0;  
}

错误是:

reference to type 'const value_type'(aka 'const adresse') could not bind to an 
lvalue of type 'adresse *'Stack1.push(temp);

怎么了?

谢谢

汤米

【问题讨论】:

  • 你试图将一个指针压入你的堆栈,但它不接受指针。
  • 一些提示:始终将 new 与 delete 配对(或委托给智能指针),切勿将指针存储在容器中(除非您需要多态性),不要胡闹并获得通知。 (顺便说一句:你的德语很糟糕)

标签: c++ struct stl stack


【解决方案1】:
adresse temp;
temp.info = eingabe;
Stack1.push(temp); // maybe `std::move(temp)` instead of `temp`

而不是 new 和您对 temp 所做的事情。 new 这里不需要。 [0] 不是必需的。不需要指针。

一般来说,new 的意思是“创建一个我将手动管理其生命周期且访问速度较慢的副本”。它返回一个指向你newed 的东西的指针。如果您不需要对所创建内容的生命周期进行细粒度控制,请改为在堆栈上创建它。

在某些现代 C++ 编码风格中,不鼓励在特定的低级资源管理函数之外对 new 进行所有调用(例如 make_sharedmake_uniqueboost::variant 等)。但是你还是需要理解指针。

您创建了一个指向某些数据的指针,并尝试将其存储在一个需要某些数据值的容器中。容器想要引用它要复制的现有数据块:您给它一个指向某些数据的指针。它们不是同一种类型,所以编译器给你一个错误,说无法自动从一种类型转换为另一种类型。

【讨论】:

    【解决方案2】:

    你有一些问题。

    首先您的标头&lt;stdio.h&gt;C 标头,在C++ 中使用&lt;cstdio&gt;

    接下来,您将创建一个指向对象的指针并尝试将该指针压入堆栈。不用做指针,直接定义对象即可。

    最后使用eingabe[0] 只会给你存储在eingabe 中的单词的第一个字母。

    尝试以下方法:

    //#include <stdio.h> // not this in C++
    #include <cstdio> // use this instead
    #include <stack>
    #include <iostream>
    #include <string>
    using namespace std;
    
    struct adresse
    {
    
        string info;
    };
    
    int main()
    {
    
        string eingabe;
        stack<adresse> Stack1;
    
        cout << "Bitte Ausdruck eingeben: " << endl;
        getline(cin, eingabe);
    
        // no need to make pointers just use
        // adresse as if it were built in
        adresse temp;
        temp.info = eingabe; // [0] will only give you the first letter
        Stack1.push(temp);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您声明您的堆栈包含adresses,但正在尝试推送adresse地址

      【讨论】:

        【解决方案4】:

        首先要做你正在做的事情,你需要一个这样的堆栈,

        stack<adresse*> Stack1;
        

        如果你想使用自己的堆栈,那么就这样推送吧

        Stack1.push(*temp);
        

        【讨论】:

          【解决方案5】:

          在编写 Stack1.push(temp) 时,tempadresse *,而 Stack1.push 需要 adresse const &amp; 参数。

          这是编译器试图告诉你的。

          要解决此问题,请不要将temp 存储为指向对象的指针,而是直接存储为对象。

          【讨论】:

            猜你喜欢
            • 2011-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 2018-10-29
            • 2015-03-13
            • 1970-01-01
            相关资源
            最近更新 更多