2014-11-19 4 views
-3

, допустим, у меня есть класс «Простой» с этим приватным var: std :: vector m_listePoint; который конструкторНаследование и STL-вектор

Simple(EnumCouleur::tEnumCouleur c,vector<Point> listeP); 

(Couleur наследуется от ее матери класса)

я получил еще один класс, который является «Круг» (дочерний класс от «Simple»), с 2-мя переменными: 1 очко, 1 радиус Вот конструктор я пробовал:

Cercle::Cercle(const Point centre, const double rayon, EnumCouleur::tEnumCouleur v) 
{ 
     m_rayon = rayon; 
     vector<Point> liste; 
     liste.push_back(centre); 
     __super::Simple(v,liste); 

} 

я получил ошибку говоря просто оленья кожа имеет конструктор по умолчанию.

Я знаю, что в принципе я должен делать это так:

Cercle::Cercle(const Point centre, const double rayon, EnumCouleur::tEnumCouleur v) : m_rayon(rayon), Simple(...) 

проблема: как построить вектор тогда?

Это может быть глупый вопрос, я не знаю, я пришел от Java, поэтому я использовал супер и может быть плохим способом ...

+0

Я нашел это здесь: http://stackoverflow.com/questions/4424216/c-equivalent-of-super – Niko

+0

Что такое ... в вашем примере? –

+0

вы не можете вызвать другой конструктор из тела другой функции, даже другого конструктора. – Mordachai

ответ

0

Используйте вектор конструктор, который делает вектор n копий элемент:

Cercle::Cercle(const Point centre, const double rayon, EnumCouleur::tEnumCouleur v) 
     : m_rayon(rayon), Simple(v, std::vector<Point>(1, centre)) { /* ... */ } 

Или, в C++ 11, используйте конструктор списка инициализатора:

Cercle::Cercle(const Point centre, const double rayon, EnumCouleur::tEnumCouleur v) 
     : m_rayon(rayon), Simple(v, {centre}) { /* ... */ } 
+0

как вы это сделаете, если у вас есть 2 значения, которые нужно положить в вектор? – Niko

+0

@Niko Метод списка инициализаторов все еще работает. В противном случае напишите вспомогательную функцию, которая конструирует и возвращает вектор. –

0

Vector имеет полезный конструктор здесь: vector(size_type count, const T& value, <irrelevent>), что позволяет легко построить вектор с одним элементом: vector<Point>(1, centre).

Как так:

Cercle::Cercle(const Point centre, const double rayon, EnumCouleur::tEnumCouleur v) 
    :m_rayon(rayon), 
    Simple(v, vector<Point>(1, centre)) 
{ 
} 

Если у вас есть несколько элементов, сделать более простую вспомогательную функцию или используйте initializer_list

initializer_list

Rect::Rect(const Point topleft, const Point botright, EnumCouleur::tEnumCouleur v) 
    :m_rayon(rayon), 
    Simple(v, {topleft, botright}) 
{ 
} 

вспомогательную функцию:

std::vector<Point> make_from_two(point one, point two) { 
    vector<Point> liste; 
    liste.push_back(one); 
    liste.push_back(two); 
    return liste; 
} 

Rect::Rect(const Point topleft, const Point botright, EnumCouleur::tEnumCouleur v) 
    :m_rayon(rayon), 
    Simple(v, make_from_two(topleft, botright)) 
{ 
} 
+0

как вы это сделаете, если у вас есть 2 значения, которые нужно положить в вектор? – Niko