2015-12-04 8 views
5

私はコンストラクタを呼び出すことができません。でも、この小さな例では、メッセージでコンパイルに失敗します。C++小さな例で直接コンストラクタを呼び出すことができません

Klassentest.cpp:24:27: error: cannot call constructor 'Sampleclass::Sampleclass' directly [-fpermissive] 

コード:

#include <iostream> 
using namespace std; 

class Sampleclass 
{ 
    public: 
    Sampleclass(); 
}; 

Sampleclass::Sampleclass(){ 

} 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    Sampleclass::Sampleclass() *qs = new Sampleclass::Sampleclass(); 
    return 0; 
} 

私はバージョン4.9.3-1でCygwinのG ++コンパイラを使用していました。

ありがとうございました。

+0

何をしようとする:

は、コンストラクタを使用することができますどのようにいくつかの簡単な例を、確認するには、以下のリンクに従ってください?なぜあなたは 'new'を使っていますか?また、C++で直接コンストラクタを呼び出すことはできません。 – TartanLlama

+3

これは単なるC++です...コンストラクタは通常の関数ではありません。[this](http://stackoverflow.com/questions/33079486/difference-between-constructor-calls-with-and-without/33079632)質問と回答 –

+0

スタックではなくヒープ上にオブジェクトを配置する必要があります。これは、問題がある小さな例の1つに過ぎません。 – GlenM

答えて

5
Sampleclass::Sampleclass() *qs = new Sampleclass::Sampleclass(); 

が間違っています。 Sampleclassタイプであり、Sampleclass::Sampleclassコンストラクタである。正しい構文は

type identifier = new type(); 

あるので、あなたはここにタイプを指定する必要があります。

したがって、

Sampleclass *qs = new Sampleclass(); 

代わりに使用します。


注:

  • あなたは知らなかった場合:C++ 11あなたは、単にクラス定義とデフォルトコンストラクタで

    Sampleclass() = default; 
    

    を行うことができますが、定義されますので、 。

+0

さらに、 'Sampleclass * qs = new Sampleclass();' 'を使用してください。 –

+0

@ ErikAlapaaああ、ありがとう、ありがとう。 – Downvoter

1
#include <iostream> 
using namespace std; 

class Sampleclass 
{ 
public: 
    Sampleclass(); 
}; 

Sampleclass::Sampleclass(){ 

} 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    Sampleclass *qs = new Sampleclass::Sampleclass(); 
    return 0; 
} 

あなたのクラスをインスタンス化するときのタイプとしてコンストラクタを参照しようとしました。

3

はい、ctorを直接呼び出すことはできません。標準から

、$ 12.1/2コンストラクタ[class.ctor]

コンストラクタが名前を持っていないので、それらは 名前検索中に発見されることはありません。

あなたはその後のctorが呼び出されます

Sampleclass *qs = new Sampleclass; 

をお勧めします。

関連する問題