2012-05-12 7 views
-2

私は書いています。"one"オブジェクトが必要、 "new"を使用する方法

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 iはElement *element= new Element;を記述する必要があります。 説明するには?

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;

ウィルヒープ上の要素へのポインタを与えます。後でdeleteが必要になります。あなたはelement->my_memberでこれのメンバーを使うことができます。

Caling:

Element element;を削除する必要はありませんし、それがスコープ外になったときに無効になりますスタック上のオブジェクトを作成します。あなたはelement.my_memberと一緒にこのメンバーを使うことができます。

+0

私は "Element element; element.somefield = false;"と書いています。私はその行にseg faultを取得しています。ありがとう – merveotesi

+2

本質的に間違っていることは何もないので、私は要素のコンストラクタまたはsomefieldのどちらかが間違っていると推測しています。おそらく、クラスの詳細を別の質問に入れて、seg faultについて質問する必要があります。 – Benj

+0

@tuxi: 'Element'クラスで何かが壊れています – sth

7

あなたが動的オブジェクトを割り当てたい場合はnewがフリーストア内のオブジェクトへのポインタを返すので、それは

Element* element = new Element; 

だろう。メモリリークを防ぐためにオブジェクトの使用が終了したら、delete elementに電話する必要があります。手動でメモリを管理することを避けるためにしたい場合は、std::unique_ptrを使用することができます:それはスコープの外に出るとき

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

そしてelementは自動的にポインタにdeleteを呼び出します。ただし、自動オブジェクトを作成したくないのは確かですか?

Element element; 

これは、自動ストレージにオブジェクトを作成し、手動でそれをまたはスマートポインタを使うの割り当てを解除する必要はありませんし、それははるかに高速です。それは最善の方法です。 (ただし、変数の宣言ではなく、関数のプロトタイプであるElement element();を実行しないようにしてください)

+1

C++ 11では、明白な要素要素{};を書くことができます。 –

関連する問題