简单的矢量程序错误

时间:2010-03-29 04:30:38

标签: c++ vector instantiation

嗨我刚接触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();

}

3 个答案:

答案 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();