2015-06-25 3 views
0


Я хочу сделать своего рода Хирархию вне классов.Использование переменной другого класса

Пример:

object.position.x 

Я хочу, чтобы иметь возможность повторно использовать класс Vector3 для скорости и других вещей, а, вот почему я хочу, чтобы сохранить его как класс. Я пробовал так.

#include"Vector3.h" 

class object{ 
    public: 
     Vector3 position; 
     Vector3 velocity; 
} 

------------------------------------- 

class Vector3{ 
    float x; 
    float y; 
    float z; 
} 

Но это, кажется, не работает так хорошо, как я ожидал.

Когда я иду за go.position.x = 0, кодовые блоки хотят, чтобы я использовал ->.

request for member 'x' in 'go.GameObject::position', which is of pointer type 'Vector3*' (maybe you meant to use '->' ?)| 

но когда я использую их как то: go.position -> x = 0, программа аварий. Может ли кто-нибудь сказать мне, что такое «правильный» или лучший подход к этому?

+2

Просьба представить реальный код, [MVCE] (http://stackoverflow.com/help/mcve) является лучшим. Сообщение компилятора говорит, что 'position' является' Vector3 * ', тогда как в вашем коде это' Vector3'. – Petr

+0

ОК я вставил реальный код в ответ. Я сожалею, что я сделал N # t, чтобы обеспечить реальный код. Я пытался получить только соответствующие части – RIJIK

ответ

2

Код, который вы вставили, является неполным, и полученная вами ошибка, похоже, исходит из другой версии кода. Вот пример использования ваших классов с указателями и без них.

#include <iostream> 
using namespace std; 

class Vector3{ 
    public: 
     float x; 
     float y; 
     float z; 
}; 

class Object { 
    public: 
     Vector3 position; 
     Vector3 velocity; 
}; 

class ObjectPointer { 
    public: 
     Vector3 *positionPtr; 
     Vector3 *velocityPtr; 

     ObjectPointer() 
     : positionPtr(new Vector3()), 
     velocityPtr(new Vector3()) 
     { 
     } 
}; 

int main() { 
    // your code goes here 
    Object obj; 
    obj.position.x = 1; 
    obj.position.y = 2; 
    obj.position.z = 3; 
    obj.velocity.x = 11; 
    obj.velocity.y = 12; 
    obj.velocity.z = 13; 

    std::cout << "Object Position (" << obj.position.x 
     << ", " << obj.position.y 
     << ", " << obj.position.z << ")" << std::endl; 
    std::cout << "Object Velocity (" << obj.velocity.x 
     << ", " << obj.velocity.y 
     << ", " << obj.velocity.z << ")" << std::endl; 

    ObjectPointer *objPtr = new ObjectPointer(); 
    objPtr->positionPtr->x = 5; 
    objPtr->positionPtr->y = 6; 
    objPtr->positionPtr->z = 7; 
    objPtr->velocityPtr->x = 15; 
    objPtr->velocityPtr->y = 16; 
    objPtr->velocityPtr->z = 17; 

    std::cout << "ObjectPointer Position (" << objPtr->positionPtr->x 
     << ", " << objPtr->positionPtr->y 
     << ", " << objPtr->positionPtr->z << ")" << std::endl; 
    std::cout << "ObjectPointer Velocity (" << objPtr->velocityPtr->x 
     << ", " << objPtr->velocityPtr->y 
     << ", " << objPtr->velocityPtr->z << ")" << std::endl; 

    return 0; 
} 
+0

Спасибо! Похоже, что мой код немного запутался в попытках исправить ошибки. Это была позиция Vector3 *; Vector3 * скорость; в моем коде. Мне не нужен оператор *. Но можете ли вы сказать мне, для чего мне нужен указатель? Я имею в виду, что это выглядит просто сложнее. – RIJIK

+0

Вам не нужно использовать указатели для Vector3 в объекте. Пример, который я вам дал, для вашей справки. Указатели более полезны в особых ситуациях, таких как полиморфизм. Вы должны использовать интеллектуальные указатели, такие как std :: shared_ptr или std :: auto_ptr, для хранения ссылки и std :: make_shared для их создания вместо использования «нового» оператора. –

0

Поскольку члены класса являются закрытыми по умолчанию, вы не можете получить к ним доступ, как position.x. Вам нужно написать геттер и сеттер для них, иначе сделайте его структурированным.

structVector3{ 
    float x; 
    float y; 
    float z; 
}; 
Смежные вопросы