Ошибка простой векторной программы - PullRequest
1 голос
/ 29 марта 2010

Привет, я новичок в c ++, и я пробую эту векторную программу, и я получаю следующую ошибку: ошибка: запрошено преобразование из test*' to non-scalar type test '|

Вот код

#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 ]

3 голосов
/ 29 марта 2010

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 голос
/ 29 марта 2010

new test () вернет указатель на t, так что вы либо захотите использовать указатель throuought, либо создать 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();
1 голос
/ 29 марта 2010

Изменение

test t=new test();
t.read();

до

test *t=new test();
t->read();

t должен быть указателем на тип test. А чтобы получить доступ к члену class с помощью pointer, мы используем оператор ->. Также рекомендуется удалять любые динамически размещенные объекты как:

delete t;
...