2009-11-03 4 views
1

У меня есть то, на что я надеюсь, это быстрый вопрос о некотором коде, который я создаю. В основном я хочу сравнить переменные среди двух экземпляров класса (goldfish), чтобы увидеть, внутри территории другого. они оба имеют кластеры территории, которые, в свою очередь, используют кластер точек, состоящий из точки данных x и y.Сравнение переменных в двух экземплярах класса

Теперь мне было интересно узнать, почему ниже не работает, пожалуйста:

(этот бит кода сравнивает два момента: а & Ь, каждый с двумя точками, северо-восток (НЭ) и юго-запад (ЕО) и их х и у участков) , если ((а-> x_ne < = b-> x_ne & & а-> y_ne < = b-> пе) & & (а-> x_sw => b-> x_sw & & a-> y_sw => b-> sw)) { return true; } else return false;

Я могу думать о работе (например, имея метод получения местоположения) и использовать функцию в основном тесте для сравнения, но мне любопытно узнать - как начинающий программист на C++ - почему выше, или аналогичная реализация не работает.

а также, что было бы ЧИСТОЕ и изящным способом выполнить вышеуказанное? есть функция друга, возможно?

большое спасибо

редактировать: добавлены некоторые комментарии к (надеюсь сделать переменные более четкие)

// class point { 
// public: 
// float x; 
// float y; 

// point(float x_in, float y_in) { //the 2 arg constructor 
//  x = x_in; 
//  y = y_in; 
// } 
// }; 

// class territory { 

// private: 
// point ne, sw; 

// public: 
// territory(float x_ne, float y_ne, float x_sw, float y_sw) 
//  : ne(x_ne, y_ne), sw(x_sw,y_sw) { 
// } 


// bool contain_check(territory a, territory b) { 
// //checks if a is contained in b (in THAT order!) 

//  if ((a->x_ne <= b->x_ne && a->y_ne <= b-> ne) && 
//  (a->x_sw => b->x_sw && a->y_sw => b-> sw)) { 
//  return true; 
// } else return false; 

^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// }; 


// class goldfish { 
// protected: 
// float size; 
// point pos; 
// territory terr; 

// public: 

// goldfish(float x, float y) : pos(x,y), terr(x-1,y-1,x+1,y+1) { //constructor 
//  size = 2.3; 
// } 

// void retreat() { //what happens in the case of loss in attack 
//  /* 
//  if(goldfish.size[1] - goldfish.size[2] <= 1 && goldfish.size[1] - goldfish.size[2] > 0) { 
//  size = size - 0.2; 
//  } 
//  */ 

// } 
// void triumph() { 
// } 

// void attack() { 

// } 
// // void goldfish() 
// }; 
+1

Описательные имена переменных приятны :). Мы больше не ограничены в персонажах, я прекратил читать, когда увидел a-> x_ne –

+0

Почему все закомментировано? – GManNickG

+0

Опубликуйте свои ошибки в компиляторе, это очень поможет. – Jonas

ответ

1

Что вы подразумеваете под "does not work"? Я не компилирую?

Если contain_check написано так, как показано на вашем посту, проблема в том, что вы используете оператор стрелки на указателях без указателей. Вместо этого используйте точку:

if ((a.x_ne <= b.x_ne && a.y_ne <= b.ne) //etc. 
+0

ah, so -> ТОЛЬКО в случаях, когда мы имеем дело с указателями? из-за де-ссылки, я полагаю? – fishtank

+0

Кроме того, a и b не имеют элементов с именем x_ne или y_ne. –

+0

@fishtank: более формально, только для типов, для которых оператор-> определен. Он автоматически определяется для указателей, но также может быть определен на любом классе. Это полезно при написании так называемых «умных» классов указателей. –

2

На первый взгляд : Не существует оператора a =>. Это называется> =

0
bool contain_check(territory a, territory b) 

Вы проходите через два объекта территории, а не указатели на объекты территории. Следовательно, вы захотите использовать оператор . для доступа к членам вместо оператора ->. Что-то вроде:

a.ne 

Дополнительно, вы объявили ne и sw членов частного, а это значит, что они не будут доступны для несвязанных функций. Они должны быть открыты для функции contain_check() для доступа к ним.

+0

g ++ ошибка, которую я получаю: Базовый операнд '->' имеет не указательный тип 'территория' , который заставлял меня думать, что что-то не так с использованием -> в этом случае? – fishtank

2

Предполагая, что ваши территории являются прямоугольниками, и вы обнаруживаете перекрытие, сравнивая углы двух классов (ne и nw), вы проверяете только северо-западные и северо-восточные углы, которые имеют область линии. Как отметил Эрик Маленфант, у вас есть структуры как члены класса, к которым обращаются «.». оператор. Этими членами являются ne и sw, поэтому для ссылки на них будут: «a.ne.х»

Так, начиная с этого:

if ((a->x_ne <= b->x_ne && a->y_ne <= b-> ne) && 
    (a->x_nw => b->x_nw && a->y_nw => b-> nw)) { 
    return true; 
    } else return false; 

Изменить это:

return ( (a.ne.x <= b.ne.x && a.ne.y <= b.ne.y) 
     && (a.sw.x >= b.sw.x && a.sw.y >= b.sw.y)); 
+0

oops, извините, опечатка там :) – fishtank

0

я заметил две возможные проблемы сразу (примечание: не C++ эксперт):

Вы use => для "больше или равно", где должно быть> =

Кроме того, я думаю, b-> ne должен be b-> y_ne.

0

Извините, я был явно (очень) смущен. Спасибо, парни! ниже работы:

if ((a.ne.x <= b.ne.x && a.ne.y <= b.ne.y) && 
     (a.sw.x >= b.sw.x && a.sw.y >= b.sw.y)) { 
    return true; 
    } else return false; 
    } 
+1

Отбросьте if-statement, он лишний. – GManNickG

0

метод BOOL территория :: contain_check (константный территория & а, Const территории & б); должен быть объявлен как статический. это имеет смысл. или, лучше, напишите его как автономную функцию, потому что она не имеет ничего общего с территорией класса; он проверяет какую-то связь между двумя экземплярами, не так ли?