Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 24.06.2018, 00:15   #1
2Lui
Форумчанин
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 67
Репутация: 0
Злость Ошибка компиляции(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; 24.06.2018 в 00:20.
2Lui вне форума   Ответить с цитированием
Старый 24.06.2018, 00:27   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,527
Репутация: 1728
По умолчанию

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

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

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

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

Код:

#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, 14:42   #6
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,527
Репутация: 1728
По умолчанию

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

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

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

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

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

Это на что похоже? Я хотел реализовать интерфейс через шаблоны
Код:

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

2Lui вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компиляции promer Общие вопросы Delphi 2 12.08.2016 13: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 14:21


22:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru