Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
1

Сравнение между объектами разных классов

02.09.2016, 19:39. Просмотров 3844. Ответов 21
Метки нет (Все метки)

Всем привет,

Есть 4 разных класса, в мэине мне нужно их сравнить.

Например:
C++
1
2
3
4
A a;
B b;
 
if(a==b) dosomething();
Можно ли сделать перегрузку операторов, что бы сравнивать переменные разных классов.
Или все таки только так:

C++
1
if(a.return_var()==b.return_var()) dosomething();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2016, 19:39
Ответы с готовыми решениями:

Как организовать передачу данных между объектами разных классов?
Есть объект doc в нутрии него создается еще два объекта ui и engine, engine в свою очередь создает...

Взаимодействие между объектами единой иерархии классов
Здравствуйте. У меня есть некоторый базовый класс window, который создает "окно" и представляет...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение,...

Работа с объектами классов
Всем здраствуйте. Помогите если вам не так сложно :) Вот сейчас я поясню, то что не могу сделать:...

21
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
02.09.2016, 20:24 2
Цитата Сообщение от kirillfit Посмотреть сообщение
Можно ли сделать перегрузку операторов, что бы сравнивать переменные разных классов.
Можно. Делай глобальную friend-функцию.
0
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
02.09.2016, 20:28  [ТС] 3
Можно подробнее...
0
Эксперт С++
1583 / 913 / 777
Регистрация: 06.02.2016
Сообщений: 2,394
Записей в блоге: 28
02.09.2016, 20:30 4
kirillfit, Через дружественную функцию для обоих классов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
class B;
class A {
    private:
        int v1;
    public:
        A(int x=0):v1(x) {}
        friend bool operator==(const A& a, const  B &b);
};
class B {
    private:
        int v2;
    public:
        B(int x=0):v2(x) {}
        friend bool operator==(const A& a, const  B &b) ;
 
};
bool operator==(const A& a, const  B &b) {
    return a.v1==b.v2;
}
int main() {
    A a(5);
    B b(7);
    if(a==b) {
        cout<<"Equal";
    } else {
        cout<<"Not yet";
    }
    return 0;
}
1
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
02.09.2016, 20:31  [ТС] 5
Все понял спасибо!
0
Avazart
02.09.2016, 21:58
  #6

Не по теме:

Вообще это не во всех случаях очевидно и хорошо выглядит.
Лучше предусмотреть отдельную функцию, или вообще подход пересмотреть.

0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
03.09.2016, 00:34 7
Цитата Сообщение от kirillfit Посмотреть сообщение
Есть 4 разных класса, в мэине мне нужно их сравнить.
Вообще то, это похоже на похвальное намерение сравнить собаку со стулом.
0
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
03.09.2016, 00:42 8
Цитата Сообщение от Olej Посмотреть сообщение
Вообще то, это похоже на похвальное намерение сравнить собаку со стулом.
Сравнить собаку со стулом, сравнивая количество ног у собаки и стула, при чем игнорируя одушевленность предмета, наличие хвоста итп.

Но опять же многое зависит от контекста.
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
03.09.2016, 02:10 9
А мб нужно что-то типа этого (в плане концепции)?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
class A {};
class B : public A {};
class C : public A {};
 
int main()
{
    A *b = new B, *c = new C;
    if (b == c)
        std::cout << "It works!";
    delete b;
    delete c;
}
1
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
03.09.2016, 19:32  [ТС] 10
MrGluck да вот именно для этого и надо было.

Это два derived класса Player и Enemy, между ними надо было сравнивать координаты x и y. Но теперь я поместил эти координаты в класс Piece который base. B main я создаю массив обектов класса Piece, так чтобы был например один Player 3 Enemy, 1 Trap, 1 Treasure. Вот теперь как мне сравнивать например все эти коордиаты между классами, в условии говорилось что нужно тоже использовать RTTI.
0
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
03.09.2016, 20:19 11
Через метод проверяющий коллизии.
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
03.09.2016, 20:22 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Base
{
protected:
    int x, y; //коодрдинаты
public:
    ...
    friend bool EqualCoord(Base* left, Base* right);
};
...
bool EqualCoord(Base* left, Base* right)
{
    return left->x == right->x && left->y == right->y;
}
 
class Player : public Base {...};
class Enemy : public Base {...};
 
int main()
{
    Base* unit1 = new Player;
    Base* unit2 = new Enemy;
    ...
    if (EqualCoord(unit1, unit2)) { ... }
}
2
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
03.09.2016, 20:28 13
Operok, Почему тогда просто не создать класс Point (с перегрузкой оператора сравнения) и включить в оба класса?
Т.е путем композиции.

Добавлено через 1 минуту
Я к тому что нужно больше контекста.
0
Operok
03.09.2016, 20:33
  #14

Не по теме:

Avazart, почему бы и нет

0
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
04.09.2016, 14:41  [ТС] 15
Ребята почему не работает? Программа компилируется нормально, ошибок не выдает, я так понял он
применяет дефолтный оператор, так как в мой не заходит и не выдает надпись тест.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Base
{
protected:
int x;
int y;
public:
friend bool operator==(const derived1& dr1,const derived2& dr2)
{
  cout<<"test"<<endl;
  return(dr1.x==dr2.x&&dr.y==dr2.y);
}
//some funcs
}
///////////////////////////////////////////////
class derived1:public Base
{
private:
//.....
public:
//.....
}
///////////////////////////////////////////////
class derived2:public Base
{
private:
//.....
public:
//.....
}
////////////////////////////////////////////////
int main()
{
Base** base_;
base_=new Base*[n];
 
base_[0]=new derived1(x,y);
base_[1]=new derived2(x,y);
 
if(base_[0]==base_[1]) cout<<"something"<<endl;
 
}
0
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
04.09.2016, 14:49 16
C++
1
if(*base_[0]==*base_[1]) cout<<"something"<<endl;
1
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
04.09.2016, 14:55  [ТС] 17
Вот сейчас ошибка компиляции.

error C2678 binary '==': no operator found which takes a left-hand operandof type 'Base' (or there is no acceptable conversion)
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
04.09.2016, 15:45 18
C++
1
2
3
4
5
friend bool operator==(const Base& b1,const Base& b2)
{
  cout<<"test"<<endl;
  return(b1.x==b2.x&&b1.y==b2.y);
}
1
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 19
04.09.2016, 18:18  [ТС] 19
Еще вопрос насчет абстрактного класса.
метод foo() в der2 мне не нужен, но в мэине компилятор не дает создать
Base _base[0] = new der2();
пишет нужно объявить метод foo(), что делать если он мне там не нужен.
И какая разница между virtual bool foo(); и просто bool foo(); в классе der1?

Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Base
{
protected:
//.......
public:
virtual bool foo()=0;
}
//////////////////////////////////////
class der1:public Base
{
private:
//.....
public:
bool foo()
{
//dosomething
}
}
//////////////////////////////////////
class der2:public Base
{
private:
//.......
public:
//здесь мне не нужен метод foo()
//other funcs
}
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
04.09.2016, 18:50 20
Цитата Сообщение от kirillfit Посмотреть сообщение
что делать если он мне там не нужен
Тогда что этот метод делает в базовом кассе? Нужно изменить иерархию классов, и, если в классе есть хоть одна чистая виртуальная функция, то это абстрактный класс.
Цитата Сообщение от kirillfit Посмотреть сообщение
И какая разница между virtual bool foo(); и просто bool foo(); в классе der1?
никакой, разве что так визуально понятно что этот метод виртуальный. Достаточно объявить метод виртуальным в одном классе и тогда у всех следующих вниз по иерархии классов этот метод будет виртуальным, а с помощью ключевого слова final можно прекратить это "безобразие"

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Base
{
protected:
//.......
public:
//virtual bool foo()=0; убрали
}
//////////////////////////////////////
class der1:public Base
{
private:
//.....
public:
bool foo()
{
//dosomething
}
}
//////////////////////////////////////
class der2:public Base
{
private:
//.......
public:
//здесь мне не нужен метод foo()
//other funcs
}
И нет никакой необходимости определять метод foo в class der2
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2016, 18:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа с объектами классов в односвязном списке
Доброго времени суток! Пытаюсь реализовать односвязный список, в который можно добавлять и выводить...

Перегрузка арифметических операций для работы с объектами классов.
Создать класс Animal, содержащий следующие элементы: - поле «вес» float Mass; - поле «пол» ...

Работа с объектами из разных файлов, использования указателя на текущий объект
Добрый день. Очень хотел бы получить помощь по следующему вопросу. мне необходимо было принести...

Сообщения между объектами
Уважаемые господа! Я недавно начал читать литературу по Smalltalk. Так вот, там коммуникация между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.