嗨我刚接触c ++并且iam尝试了这个矢量程序,我收到以下错误:
错误:从test*' to non-scalar type
test'转换为<| p>
这是代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
class test{
string s;
vector <string> v;
public:
void read(){
ifstream in ("c://test.txt");
while(getline(in,s))
{
v.push_back(s);
}
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<"\n";
}
}
};
int main()
{
cout<<"Opening the file to read and displaying on the screen"<<endl;
test t=new test();
t.read();
}
答案 0 :(得分:3)
new
用于动态分配内存。你不需要这样做,所以就这样做:
test t; // create an instance of test with automatic storage
t.read(); // invoke a method
错误是因为new test()
的类型是test*
,指向(新创建的)test
的指针。您无法将test*
分配给test
。
指针版本,它的价值,应该是:
test* t = new test();
t->read(); // the arrow is short for (*test).
delete t; // don't forget to clean up!
然而,做这样的原始内存分配是不好的方式。你会使用一种称为智能指针的东西来确保它被自动删除。标准库在标题<memory>
中有一个名为auto_ptr
的标准库就足够了:
std::auto_ptr<test> t(new test()); // put a new test into a pointer wrapper
t->read(); // treat it like a normal pointer
// nothing else to worry about, will be deleted automatically
但是,在这种情况下,您不需要这一切。始终更喜欢动态分配的自动(堆栈)分配。
答案 1 :(得分:1)
更改
test t=new test();
t.read();
到
test *t=new test();
t->read();
t
应该是指向test
类型的指针。要使用class
访问pointer
成员,我们会使用->
运算符。删除任何动态分配的对象也是一种很好的做法:
delete t;
答案 2 :(得分:1)
new test()将返回一个指向t的指针,因此您要么想要使用指针,要么在堆栈上创建t
使用指针的代码
test *t=new test();
t->read(); // note needs -> rather than .
delete t; // as declared n the heap you must delete
或通常更好地在堆栈上做所有
test t;
t.read();