我遇到这样的问题: 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);
有什么问题?
由于
托米
答案 0 :(得分:5)
adresse temp;
temp.info = eingabe;
Stack1.push(temp); // maybe `std::move(temp)` instead of `temp`
而不是new
以及您使用temp
所做的事情。此处不需要new
。 [0]
不是必需的。指针不是必需的。
一般来说,new
表示&#34;创建一个副本,我将手动管理其生命周期,并且访问速度较慢&#34;。它返回指向new
ed的事物的指针。如果您不需要对所创建内容的生命周期进行细粒度控制,请在堆栈中创建它。
在一些现代C ++编码样式中,不鼓励在特定低级别资源管理功能之外调用new
(例如make_shared
或make_unique
或boost::variant
等)。但是你仍然需要理解指针。
您创建了一个指向某些数据的指针,并尝试将其存储在需要某些数据值的容器中。容器需要引用它将复制的现有数据块:您为它指定了一些指向某些数据的指针。这些类型不同,因此编译器给出了一个错误,指出无法自动从一种类型转换为另一种类型。
答案 1 :(得分:0)
您声明您的堆栈包含adresse
,但是正在尝试推送adresse
的地址。
答案 2 :(得分:0)
首先要做你正在做的事情,你需要一个像这样的堆栈,
stack<adresse*> Stack1;
如果你想使用自己的堆栈,那就按这样推送
Stack1.push(*temp);
答案 3 :(得分:0)
撰写Stack1.push(temp)
时,temp
为adresse *
,而Stack1.push
则需要adresse const &
参数。
这是编译器试图告诉你的。
要解决此问题,请不要将temp
存储为指向对象的指针,而是直接存储为对象。
答案 4 :(得分:0)
你有一些问题。
首先,您的标题<stdio.h>
是一个C
标题,C++
使用<cstdio>
。
接下来,您将创建一个指向对象的指针,并尝试将该指针推送到堆栈上。无需制作指针,只需直接定义对象即可。
最后使用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;
}