2015-12-31 2 views
-2

В настоящее время im работает над классом CVector, все работает нормально, пока я не захотел использовать векторы в других классах, например CVector v;, и использовать v позже.Класс имеет более одного конструктора

хорошо, проблема лежит - я хотел бы использовать

struct Vector3_t { 
    float x, y , z; 

}; 

, но я хочу использовать операторы для этих векторов, поэтому я сделал класс:

class CVector 
{ 
public: 

    //missing usage: CVector vec; // for later usage in example. 
    CVector() // usage: CVector v(); 
    { 
     this->x = 0, this->y = 0, this->z = 0; 
    } 

    CVector(const float x = 0, const float y = 0) { // usage: CVector v(1,2); // but z is always 0 
     this->x = x, this->y = y,this->z = 0; 
    } 

    CVector(const float x = 0, const float y = 0, const float z = 0) { // usage: CVector v(1,2,3); 
     this->x = x, this->y = y, this->z = z; 
    } 

    CVector & CVector::operator += (const CVector & v) { 
     this->x += v.x; this->y += v.y; this->z += v.z; return *this; 
    } 
    const CVector CVector::operator + (const CVector& v) const { 
     CVector r(*this); return r += v; 
    } 

    float x, y, z; 
    ~CVector() {}; 
protected: 

private: 
}; 

в действии:

int main() { 

    CVector vec; 
    return 0; 
} 

выходные ошибки: Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активный) класс «CVector» имеет более одного конструктора по умолчанию mebad c: \ Users \ lifesucks \ Documents \ Visual Studio 2015 \ Projects \ mebad \ mebad \ main.cpp 43

* Код серьезности Описание Состояние подавления строки файла проекта Ошибка C2668 'CVector :: CVector': неоднозначный вызов перегруженной функции mebad c: \ users \ lifesucks \ documents \ visual studio 2015 \ projects \ mebad \ mebad \ main.cpp 43

В основном я просто понятия не имею, как объявить класс для такого использования при наличии нескольких конструкторов, и я не хочу использовать больше удовольствия ction как CVector :: constr1, который использовал бы 3 поплавки или что-нибудь подобное, должен быть способ сделать это таким образом, могу ли я получить немного помощи? Благодаря!

+0

_ «но я хочу использовать операторы для этих векторов, поэтому я сделал класс» _, 'struct's может иметь оператор перегружает тоже. – emlai

+1

@Grantly не должен быть там, я просто пытался показать, что ui пробовал разные способы, но не нашел его, дайте мне сек, я отредактирую его, чтобы не ошибиться u-zenith, и если бы я хотел использовать его таким образом с классом, мог бы я получаю помощь? Меня это очень интересует, я бы не просил об этом иначе. –

+1

При отправке вопросов о коде, который дает вам ошибки, включите * все * вывода в вопрос, полный и неотредактированный. –

ответ

3

Проблема заключается в том, что вы используете значения по умолчанию для аргументов двух из конструкторов, это означает, что у вас есть три конструктора, которые могут быть вызваны без аргументов, и что должен вызвать компилятор?

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

+3

Или, лучше, удалите все, кроме конструктора с тремя аргументами. – emlai

+0

Что вы подразумеваете под значениями аргументов? Вы хотите, чтобы я удалял конструкторы или 'this-> x = 0' и т. Д.? –

+0

Аргумент VALUES - это «= 0» и т. Д. В определении функции. – Grantly

0

Ваш класс должен быть

class CVector 
{ 
public: 
    CVector() : x(0), y(0), z(0) {} 
    CVector(float x) : x(x), y(0), z(0) {} 
    CVector(float x, float y) : x(x), y(y), z(0) {} 
    CVector(float x, float y, float z) : x(x), y(y), z(z) {} 

    //... 

    float x, y, z; 
}; 

или

class CVector 
{ 
public: 
    CVector(float x = 0, float y = 0, float z = 0) : x(x), y(y), z(z) {} 

    //... 

    float x, y, z; 
}; 
0

Joachim Pileborg ответил на это отлично, и заслуживает очки.

Вот код изменения вы chould сделать:

CVector() // usage: CVector v(); 
{ 
    this->x = 0, this->y = 0, this->z = 0; 
} 

CVector(const float x, const float y) { // usage: CVector v(1,2); // but z is always 0 
    this->x = x, this->y = y,this->z = 0; 
} 

CVector(const float x, const float y, const float z) { // usage: CVector v(1,2,3); 
    this->x = x, this->y = y, this->z = z; 
} 
Смежные вопросы