2016-05-02 5 views
3

Я сам изучаю C++ как новичок, и у меня возникли некоторые проблемы с вложенными классами. Я пытался определить класс для четырехугольника, заданного четырьмя вершинами (определим точку, называемую вершинами), которая представлена ​​объектом вложенного класса для двумерных точек. Я использую только одно очко, чтобы проверить свой ответ. Мой ответ на этот вопрос:Ошибка вложенных классов в 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)'

и пристали в течение целого дня. Может кто-нибудь объяснить, что не так в моем коде? Я знаю, что что-то не так с моим конструктором, но я просто не мог это исправить ...

+0

При размещении вопросов о ошибках сборки, пожалуйста, включите вывод * полной * ошибки, включая любые информационные заметки. Скорее всего, сообщение об ошибке содержит всю необходимую информацию, но, поскольку мы не видим этого, у нас нет всей информации. Поэтому, пожалуйста, отредактируйте свой вопрос, чтобы включить полный вывод, в полном объеме и неотредактированный, просто скопированный. –

+0

Пока вы на нем, пожалуйста, [drop this 'using namespace std;'] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad- практика);) – Quentin

+0

слегка offtopic: Почему 'vertex' является вложенным классом' quadrangle'? Будет, например, class 'triangle' определяют разные вершины? – VolkerK

ответ

3

Ваша ошибка сказать все это, вы не имеете конструктора:

quadrangle(const vertex & old); 

и требуется, чтобы сделать эту инициализацию:

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

Вещь в вашей второй части действительно является указателем на функцию. Типы функций в объявлении параметров параметров функции к указателям, как и массивы. [Live check] (http://coliru.stacked-crooked.com/a/40d2668b9f5c7bdc) – Quentin

+0

@Quentin Я не знал, что, thanx – marcinj

6

Ниже приведено не то, что вы ожидаете:

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

это конструктор, который принимает функцию, возвращающую вершину и принимающую 2 int. , а затем вы инициализируете элемент vertex p1 с неинициализированным членом a и b.

То, что вы хотите, это просто:

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

(и удалить члены a, b).