Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2018, 23:15   #1
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
Злость Ошибка компиляции(MVS C++)

Код:
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <time.h>
using namespace std;
template<class T>
__interface IComparable
{
	int comparable(T* obj); //Повертає 0 - рівні, >0 - якщо перше більше, 0< перше менше
};

class Client :public IComparable<Client>
{
protected:
	int ID;
	double balance;
public:
	double get_balance() { return balance; }
	Client(int ID, double balance) :ID(ID), balance(balance) {}
	Client(int ID) :Client(ID, 1000){}
	int comparable(Client* obj)
	{
		double tmp = get_balance();
		if (tmp == obj->get_balance())
		{
			return 0;
		}
		if (tmp > obj->get_balance())
		{
			return 1;
		}
		return -1;
	}

};

class GoldenClient :public Client,public IComparable<GoldenClient>
{
protected:
	double loanLimit;
public:
	double get_loanLimit() { return loanLimit; }
	GoldenClient(int ID, double balance, double loanLimit) :Client(ID, balance), loanLimit(loanLimit){}
	int comparable(GoldenClient* obj) {
		double tmp = get_balance();
		if (tmp == obj->get_balance())
		{
			return 0;
		}
		if (tmp > obj->get_balance())
		{
			return 1;
		}
		return -1;
	}
};
template<class AnyType>
IComparable<AnyType>* get_max_client(IComparable<AnyType>** objClients, int count)
{
	IComparable<AnyType>* max = objClients[0];
	for (int i = 1; i < count; i++)
	{
		if (max->comparable(objClients[i]) < 0)
		{
			max = objClients[i];
		}
	}
		return max;
}
int main()
{
	Client** client = new Client*[4];
	client[0] = new Client(1, 2000);
	client[1] = new Client(2, 2500);
	client[2] = new GoldenClient(3, 1700,2000);
	client[3] = new GoldenClient(4, 1500, 2000);
	Client* maxBal = (Client*)get_max_client<Client>((IComparable<Client>**)client, 3);
	printf("bal: %f", maxBal->get_balance());
	system("pause");
    return 0;
}
Цитата:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2664 "int IComparable<Client>::comparable(T *)": невозможно преобразовать аргумент 1 из "IComparable<Client> *" в "Client *" ConsoleApplication42 c:\users\admin\source\repos\console application42\consoleapplication42\ consoleapplication42.cpp 63
Уже создавал подобную тему, так и не разобрался хочу полностью понять почему и что оно от меня хочет ?: 63 строка ошибка

Последний раз редактировалось 2Lui; 23.06.2018 в 23:20.
2Lui вне форума Ответить с цитированием
Старый 23.06.2018, 23:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 2Lui Посмотреть сообщение
что оно от меня хочет
Оно ничего не хочет, это вы хотите превратить указатель на родительский класс на указатель на класс наследник.
Это делается приведением типов (typecast).
Но все это слегка бредово - зачем вам в функцию get_max_client передавать массив других типов? Передавайте массив указателей Client и дело с концом.
Я уж молчу, что толку от IComparable в таком виде ровно ноль - ничего не мешает в каждом классе просто написать метод compare с нужным типом - ему даже не надо быть виртуальным.

Последний раз редактировалось waleri; 23.06.2018 в 23:34.
waleri вне форума Ответить с цитированием
Старый 24.06.2018, 00:13   #3
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Ну есть у меня допустим вот 2 класса как их сравнить по балансу? через интерфейс !
2Lui вне форума Ответить с цитированием
Старый 24.06.2018, 12:03   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 2Lui Посмотреть сообщение
через интерфейс
Прочитайте про dynamic_cast.
waleri вне форума Ответить с цитированием
Старый 24.06.2018, 13:31   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include <iostream>
#include <cstring>
#include <ctime>
#include <cassert>

using namespace std;
template<class T>
__interface IComparable
{
	int comparable(T* obj); 
};

class Client :public IComparable<Client>
{
protected:
	int ID;
	double balance;
public:
	double get_balance() { return balance; }
	Client(int ID, double balance) :ID(ID), balance(balance) {}
	Client(int ID) :Client(ID, 1000){}
	int comparable(Client* obj)
	{
		double tmp = get_balance();
		if (tmp == obj->get_balance())
		{
			return 0;
		}
		if (tmp > obj->get_balance())
		{
			return 1;
		}
		return -1;
	}

};

class GoldenClient :public Client,public IComparable<GoldenClient>
{
protected:
	double loanLimit;
public:
	double get_loanLimit() { return loanLimit; }
	GoldenClient(int ID, double balance, double loanLimit) :Client(ID, balance), loanLimit(loanLimit){}
	int comparable(GoldenClient* obj) {
		double tmp = get_balance();
		if (tmp == obj->get_balance())
		{
			return 0;
		}
		if (tmp > obj->get_balance())
		{
			return 1;
		}
		return -1;
	}
};
template<class AnyType>
IComparable<AnyType>* get_max_client(IComparable<AnyType>** objClients, int count)
{
	IComparable<AnyType>* max = dynamic_cast<IComparable<AnyType>*>(objClients[0]);
    assert(max);
	for (int i = 1; i < count; i++)
	{
        AnyType* client = dynamic_cast<AnyType*>(objClients[i]);
        assert(client);
        
        if (max->comparable(client) < 0)
			max = objClients[i];
	}
    return max;
}
int main()
{
	Client** client = new Client*[4];
	client[0] = new Client(1, 2000);
	client[1] = new Client(2, 2500);
	client[2] = new GoldenClient(3, 1700,2000);
	client[3] = new GoldenClient(4, 1500, 2000);
	Client* maxBal = (Client*)get_max_client<Client>((IComparable<Client>**)client, 3);
	printf("bal: %f", maxBal->get_balance());
}
_Bers вне форума Ответить с цитированием
Старый 24.06.2018, 13:42   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

@_Bers
А если будем использовать dynamic_cast зачем нам шаблон IComparable?
waleri вне форума Ответить с цитированием
Старый 24.06.2018, 14:31   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
@_Bers
А если будем использовать dynamic_cast зачем нам шаблон IComparable?
переадресуйте свой вопрос автору кода.
_Bers вне форума Ответить с цитированием
Старый 24.06.2018, 18:19   #8
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

А причем тут я? я хотел сделать через шаблоны. А вообще интересная штука этот dynamic_cast.

Последний раз редактировалось 2Lui; 24.06.2018 в 18:49.
2Lui вне форума Ответить с цитированием
Старый 25.06.2018, 00:19   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 2Lui Посмотреть сообщение
через интерфейс !
Цитата:
Сообщение от 2Lui Посмотреть сообщение
я хотел сделать через шаблоны
Определитесь уже...
waleri вне форума Ответить с цитированием
Старый 25.06.2018, 15:10   #10
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Это на что похоже? Я хотел реализовать интерфейс через шаблоны
Код:
template<class T>
__interface IComparable
{
	int comparable(T* obj); 
};
2Lui вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компиляции promer Общие вопросы Delphi 2 12.08.2016 12:38
MVS 2010 выдает ошибку и вылетает при компиляции zink Visual C++ 1 29.11.2012 23:32
Фатальная ошибка в MVS 2010. OrioshQaaaa Visual C++ 12 12.06.2012 23:56
MVS C++ 2008 (Ошибка пути к *.exe) Geg[C/c++] Общие вопросы C/C++ 10 16.09.2009 05:02
Ошибка в MVS 2008 TheWanderer Общие вопросы C/C++ 9 12.11.2008 13:21