2012-05-12 3 views
-2

Я написал;Нужен «один» объект, как использовать «новый»

Element element=new Element; 

У меня ошибка;

homework.cpp: In function 'int main(int, char**)': 
homework.cpp:227:29: error: conversion from 'Element*' to non-scalar type 'Element' requested 

*** 1 errors, 0 warnings 

Я не хочу, указатель или массив элементов,

Altough я должен написать Element *element= new Element;. SOmebody, чтобы объяснить?

EDIT:

Элемент Класс:

class Element{ 
    public: 
     Element():exists(false){}; 

     std::string name; 
     std::string full_path_name; 
     ElementType element_type; 
     long element_size; 
     bool exists; 

    }; 
+0

У вас есть дополнительная точка с запятой после вашего конструктора. – chris

+0

Почему вы не хотите указатель? –

+0

Я не знаю, как использовать указатели очень хорошо, это делает seg ошибки, которые я не могу решить. не могли бы вы посоветовать вам посмотреть, где происходит повреждение памяти? – merveotesi

ответ

1

Если объект не нужны никакие аргументы, которые вы можете сделать

Element * element=new Element(); 

Если объект должен аргументы в конструкторе, они должны быть Прошлые работы:

Element * element=new Element(argument1, argument2); 
0

Вызывая new, вы выделяете объект в куче памяти, а не в стеке (например, в случае Element element;).

Правильный путь заключается в использовании Element *element= new Element();

Это не будет выделять память для нескольких объектов (в том случае, если бы написал new[])

1

Призвание:

Element * element = new Element;

Will дать вам указатель на элемент в куче, который вам понадобится позже, delete. Вы можете использовать его членов с element->my_member.

Caling:

Element element; создаст объект в стеке, который не нужно быть удалены, и будет признан недействительным, когда он выходит из области видимости. Вы можете использовать его членов с element.my_member.

+0

если я пишу только «Элемент element; element.somefield = false;» я получаю seg ошибку на этой линии. спасибо – merveotesi

+2

В этом нет ничего неправильного, поэтому я предполагаю, что что-то не так с конструктором элемента или с каким-то полем. Возможно, вы должны поместить детали класса в другой вопрос и спросить об ошибке seg. – Benj

+0

@tuxi: тогда что-то сломано в классе 'Element' – sth

7

Если вы хотите выделить динамический объект, он будет

Element* element = new Element; 

Потому что new возвращает указатель на объект в свободном магазине. Вы должны позвонить delete element, когда вы закончите использовать этот объект, чтобы предотвратить утечку памяти. Если вы хотите, чтобы избежать необходимости вручную управлять памятью, вы можете использовать std::unique_ptr:

std::unique_ptr<Element> element = new Element; 

И element будет вызывать delete на указатель автоматически, когда он выходит из области видимости. Однако вы уверены, что не хотите создавать автоматический объект?

Element element; 

Это создает объект автоматического хранения и вам не придется вручную освободить его или использования смарт-указатели, и это намного быстрее; это лучший способ. (Но убедитесь, что вы не делаете Element element();, который является прототипом функции, а не декларацией переменной.)

+1

В C++ 11 вы можете написать элемент Element {}; ', который однозначен. –

Смежные вопросы