2013-04-20 2 views
0

У меня есть класс 'Вектор', который хранит значения x, y, z. У меня есть класс ', который имеет несколько объектов' Vector '.Как я могу использовать NULL в этой ситуации?

Camera::Camera(Vector Pos, Vector LookAt, Vector UpDir) 
{ 
} 
Camera Cam(Vector(3,3,3), Vector(0,0,0), Vector(0,0,0)); 

Иногда я не хочу, чтобы передать вектор (0,0,0), я бы предпочел, чтобы передать NULL и тест, если LookAt/UpDir == NULL или нет, но NULL не хочет работать в этой ситуации. Что мне делать?

Надеюсь, что это имеет смысл

+0

Отформатируйте свой пост. –

+0

Укажите значения по умолчанию для параметров, и вам не придется забывать пропускать (0,0,0) явно. – StoryTeller

+2

Что такое мотивация? Вы пытаетесь сохранить некоторую типизацию? Вас беспокоит ясность?Вас беспокоит производительность? –

ответ

2

Определить статический член с именем null.

class Camera { 
    static Vector Null; 
} 

Vector Null(0,0,0); 

Затем используйте его, когда вам нужно сравнить.

if(my_vector == Camera::Null){ 
} 

Если это всегда будет самым идиоматическим подходом.

+3

Это должно быть «static Vector Null», –

+0

@LokiAstari Исправлено. – RedX

+2

Я бы отправился на вектор :: Zero самостоятельно ... – Goz

0

Если возможно, измените свой интерфейс на указатель вектора.

Camera::Camera(Vector *Pos, Vector *LookAt, Vector *UpDir) 
{ 
} 

И назовите его адресом вашего вектора;

Camera Cam(&v1, &v2, NULL); 
+1

Не делайте этого. Теперь нам нужно начать беспокоиться о собственности. Это приводит к разным проблемам, особенно с новичками. Пока вы не поймете, что концепция собственности очень жестко придерживается ценностей, а не указателей (указатели должны быть обернуты интеллектуальными указателями для контроля продолжительности жизни и указания семантики владения). Это не C. –

+0

Это начинается с предположения, что вы _have_ адресу этих векторов. То есть предпочтительный формат в вопросе ('Camera Cam (Vector (3,3,3), NULL, NULL)' ломается, потому что вы не можете перенести адрес первого временного. – MSalters

1

Вы можете определить конструктор по умолчанию для Vector и предоставить возможность Vector знать, что он пуст. Если критерии для пустого вектора меняются от трех нулей к другому числу или чем-то совершенно другому, вы можете изменить функцию empty() для обработки этих условий без изменения камеры.

Camera::Camera(Vector Pos, Vector LookAt, Vector UpDir) 
{ 
    if(LookAt.empty()) 
    { 
    //do something; 
    } 
} 

Camera Cam(Vector(3,3,3), Vector(), Vector()); 

Озабоченность со статическим членом камеры инициализируется тремя нулями является зависимостями будет ввести в другие классы, которые также необходимо проверить, если вектор является NULL. Они должны будут включить заголовочный файл камеры для доступа к объявлению. Для меня он заставляет Vector зависить от камеры определять NULL-критерии, а не наоборот, о чем я думаю, может быть проблематично поддерживать.

Я вдохновляюсь, чтобы написать это после прочтения о методах нарушения зависимости в работе эффективно с устаревшим кодом Майкла Персе.

0

Если Vector объект может иметь недопустимое состояние, вы можете использовать следующий подход:

class Vector 
{ 
public: 
    int x, y, z; 
    bool valid; 

    Vector() : x(0), y(0), z(0), valid(false) {} 
    Vector(int x, int y, int z) : x(x), y(y), z(z), valid(true) {} 
}; 

Тогда ваш Camera класс:

class Camera 
{ 
public: 
    Camera(const Vector &pos, const Vector &lookAt, const Vector &upDir) 
    { 
     if (!lookAt.valid) {...} 
    } 
}; 

Использование:

Camera c(Vector(1,2,3), Vector(), Vector()); 

Вы можете определить статический экземпляр для значений по умолчанию:

class Vector 
{ 
public: 
    static Vector INVALID; 
private: Vector(); // make invalid constructor private 
}; 

Vector Vector::IVALID; 

Использование:

Camera c(Vector(123), Vector::INVALID, Vector(12,4,5)); 
Смежные вопросы