2016-05-02 4 views
3

私は初心者としてC++を自習しており、ネストされたクラスに関するいくつかの問題に直面しました。私は4つの頂点(頂点と呼ばれる点を定義する)を与えられた四角形のクラスを定義しようとしていました。 は2次元の点の入れ子になったクラスのオブジェクトで表されます。私は自分の答えをテストするために1点しか使用しません。質問に対する私の答えは次のとおりです。 C++のネストされたクラスエラー

#include <iostream> 
#include <assert.h> 
using namespace std; 

class quadrangle 
{ 
public: 
    class vertex 
    { 
    private: 
    public: 
     int x, y; 
     friend class quadrangle; 
     vertex(); 
     vertex(int a, int b); 
     vertex(const vertex & old); 
    }; 
    vertex p1; 
    int a, b; 
    friend class vertex; 
    quadrangle(); 
    quadrangle(vertex(int a, int b)) : p1(a,b) {}; 
    quadrangle(const quadrangle & old); 
    void draw(); 

}; 
quadrangle::vertex::vertex() 
{ 
    x = 0; y = 0; 
} 
quadrangle::vertex::vertex(int a, int b) 
{ 

    x = a; y = b; 
} 
void quadrangle::draw() 
{ 
    cout << "p1: (" << p1.x << "," << p1.y << ") " << endl; 
} 
quadrangle::quadrangle() 
{ 
    p1.x = 0; p1.y = 0; 
} 
int main() 
{ 
    quadrangle q1(quadrangle::vertex(2,3)); 
    q1.draw(); 
} 

はどういうわけか、私はちょうど

error: no matching function for call to 'quadrangle::quadrangle(quadrangle::vertex)'

を持って、全体の午後のために立ち往生しています。誰かが私のコードで何が間違っているのか説明できますか?

quadrangle(const vertex & old); 

、この初期化を行うために必要とされています:あなたのエラーはあなたがコンストラクタを持っていけない、それをすべて言う

+0

ビルドエラーに関する質問を投稿する際には、情報メモを含めた*完全なエラー出力を含めてください。ほとんどの場合、エラーメッセージには実際に必要なすべての情報が含まれていますが、すべての情報が表示されているわけではありません。だからあなたの質問を編集して、完全なものと編集されていないものをコピーして貼り付けた完全な出力を含めてください。 –

+0

あなたがそれをしている間に、[名前空間std;を使用してそれを落としてください](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad-練習);) – Quentin

+0

若干offtopic:なぜ 'vertex'は' quadrangle'のネストされたクラスですか?例えば。クラス 'triangle'は異なる頂点を定義しますか? – VolkerK

答えて

3

...私は何かが私のコンストラクタで間違っているのを知っているが、私はちょうどそれを修正することができませんでした

quadrangle q1(quadrangle::vertex(2,3)); 

そして、これは本当に奇妙です:

quadrangle(vertex(int a, int b)) : p1(a,b) { } 

それは、関数プロトタイプ(または関数型?)を取っているコンストラクタのようですが、それは私が推測する関数ポインタではありません。 p1(a,b)は、クラスにそのような変数があるためにのみコンパイルされます。

[編集]クエンティンからのコメントの後

- 宣言上記の関数ポインタの例以下

Function types in a function parameters' declaration decay to pointers

は、関数のパラメータとして関数ポインタを書くことができますさまざまな方法を示している。

std::string bar(int a, int b) { 
    std::cout << "bar"; 
    return ""; 
} 
void foo1(std::string(int a, int b)) { } // Unnamed function pointer 
void foo2(std::string(pf)(int a, int b)) { pf(0,0); } // Named function pointer 
void foo3(std::string(*pf)(int a, int b)) { pf(0,0);} // Named function pointer 

int main() { 
    foo1(bar); 
    foo2(bar); 
    foo3(bar);  
} 
+1

2番目の部分のものは、実際には関数ポインタです。関数型宣言の関数型は、配列と同様にポインタに崩壊します。 [ライブチェック](http://coliru.stacked-crooked.com/a/40d2668b9f5c7bdc) – Quentin

+0

@Quentin私はそれを知っていない、高校 – marcinj

6

あなたの期待通りではありません:

quadrangle(vertex(int a, int b)) : p1(a,b) {}; 

頂点を返す関数をとってをとるコンストラクタです。 とし、メンバ頂点p1を初期化します。非初期化メンバabです。何をしたい

は単純です:

quadrangle(const vertex& v) : p1(v) {} 

(とメンバーabを削除します)。

関連する問題