Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка / 10 сообщений из 10, страница 1 из 1
25.07.2005, 14:08
    #33182646
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
У меня есть базовый класс CCell.
Есть наследникик CIntegerCell и CTextCell в каждои из них определены private переменные члены
CIntegerCell::(int)Value и CTextCell::(std::string)Value
Соответственно есть к ним функции доступа
void SetVal(int);
int GetVal(void);
и
void SetVal(std::string);
std::string GetVal(void);
соответственно для каждого класса

Так вот у меня нужно в базовом классе иметь виртуальные функции SetVal и GetVal для позднего связывания.
Посоветуйте как лучше сделать.
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
25.07.2005, 15:25
    #33182956
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
Сам придумал
привел во всех функция возвращаемый параметр к void а если нужно что то вернуть то передаю ссылку на переменную в которую нужно возвратить результат.
вот теперь заработало весь полиморфизм...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
25.07.2005, 16:05
    #33183085
stm_2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
synapseСам придумал
привел во всех функция возвращаемый параметр к void а если нужно что то вернуть то передаю ссылку на переменную в которую нужно возвратить результат.
вот теперь заработало весь полиморфизм...


Это метод C, а в C++ надо использовать параметризированные(шаблонные)
функции/классы.
...
Рейтинг: 0 / 0
25.07.2005, 16:16
    #33183124
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
synapseСам придумал
привел во всех функция возвращаемый параметр к void а если нужно что то вернуть то передаю ссылку на переменную в которую нужно возвратить результат.
вот теперь заработало весь полиморфизм...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@

Покажи свой вариант, плз.
Если ты изобрел что-то вроде:

Код: plaintext
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
class C
{
public:
	virtual void SetVal(int val) =  0 ;
	virtual void SetVal(std::string val) =  0 ;
	virtual void GetVal(int& val) =  0 ;
	virtual void GetVal(std::string& val) =  0 ;
};

class C1 : public C
{
public:
	virtual void SetVal(int val) {m_val = val;};
	virtual void SetVal(std::string val) {m_val = atoi(val.c_str());};
	virtual void GetVal(int& val) {val = m_val;};
	virtual void GetVal(std::string& val) {char buf[ 64 ]; itoa(m_val, buf,  10 ); val = string(buf);};
private: 
	int m_val;
};

class C2 : public C
{
public:
	virtual void SetVal(int val) {char buf[ 64 ]; itoa(val, buf,  10 ); m_val = string(buf);};
	virtual void SetVal(std::string val) {m_val = val;};
	virtual void GetVal(int& val) {val = atoi(m_val.c_str());};
	virtual void GetVal(std::string& val) {val = m_val;};
private: 
	std::string m_val;
};

void Test(C &c, int n, const string& s)
{
	c.SetVal(n);

	int n1 =  0 ;
	string s1;
	c.GetVal(n1);
	c.GetVal(s1);

	cout << "n1 = " <<  n1 << " s1 = " << s1 << endl;

	c.SetVal(s);

	int n2 =  0 ;
	string s2;
	c.GetVal(n2);
	c.GetVal(s2);

	cout << "n2 = " <<  n2 << " s2 = " << s2 << endl;
}

int main()
{

	C1 c1;
	C2 c2;

	cout <<  endl <<  "Test C1 (int)" << endl;
	Test(c1,  10 , "100");

	cout <<  endl <<  "Test C2 (string)" << endl;
	Test(c2,  20 , "200");

	return  0 ;
}

То, посмотри в сторону boost::any (http://www.boost.org/doc/html/any.html)
Примерно такой вариант (писался на коленке, от балды, плз не бить ногами :))

Код: plaintext
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.
42.
43.
44.
45.
46.
47.
48.
49.
#include <boost/any.hpp>
using boost::any_cast;

class Cell
{
public:
	virtual void SetVal(const boost::any& val) {m_val = val;};
	template<class T> void GetVal(T& val) 
	{ 
		try
		{
			val = any_cast<T>(m_val);
		}
		catch(const boost::bad_any_cast &)
		{
			cout << "bad cast!!  ";
		}
	};
private:
	boost::any m_val;
};

void TestCell(Cell &c, int n, string s )
{
	c.SetVal(n);
	int n1 =  0 ; 	c.GetVal(n1);
	cout << "GetVal (int) = " << n1 << endl;
	
	string s1;   	c.GetVal(s1);
	cout << "GetVal (int) = " << s1 << endl;

	c.SetVal(s);

	int n2 =  0 ; 	c.GetVal(n2);
	cout << "GetVal (string) = " << n2 << endl;

	string s2;   	c.GetVal(s2);
	cout << "GetVal (string) = " << s2 << endl;

}

int main()
{
	cout <<  endl <<  "Test Cell (any)" << endl;
	Cell c;
	TestCell(c,  30 , "300");

	return  0 ;
}
...
Рейтинг: 0 / 0
25.07.2005, 19:05
    #33183601
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
synapse

Интересно, и зачем весь этот огород городить было нужно? Ну получите вы полиморфный метод который может вернуть что угодно. А использовать его вы как планируете? Судя по всему клиенты этого класса будут по каким-то признакам определять конкретный тип!?

imho налицо ошибка в проектировании... вы бы рассказали что это за классы и для чего они используются!
...
Рейтинг: 0 / 0
26.07.2005, 07:46
    #33183918
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
funikovyuri synapse

Интересно, и зачем весь этот огород городить было нужно? Ну получите вы полиморфный метод который может вернуть что угодно. А использовать его вы как планируете? Судя по всему клиенты этого класса будут по каким-то признакам определять конкретный тип!?

imho налицо ошибка в проектировании... вы бы рассказали что это за классы и для чего они используются!

Просветите пожалуйста что за ошибка такая...
Есть тестовое задание сделать электронную таблицу.(не надо мне про изобретение велосипеда говорить)
Так вот так и проектирую:
есть базовый класс CCell а от него производные CIntegerCell,CTextCell...
так ладно щас хедеры покажу...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class CCell
{
public:
	CCell(void);
	~CCell(void);
	virtual void GetVal(int &val)const;
	virtual void GetVal(char &val)const;
	virtual void SetVal(int val);
	virtual void SetVal(char *val);
	void SetType(int type);
	int GetType(void);
protected:
	int CellType;
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class CIntegerCell :
	public CCell
{
public:
	CIntegerCell(void);
	CIntegerCell(int type);
	~CIntegerCell(void);
	virtual void SetVal(int val);
	virtual void GetVal(int &val)const;
private:
	int Value;
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class CTextCell :
	public CCell
{
public:
	CTextCell(void);
	CTextCell(int type);
	~CTextCell(void);
	virtual void GetVal(char &val)const;
	virtual void SetVal(char *val);
private:
	char *Value;
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class CExpressionCell :
	public CCell
{
public:
	CExpressionCell(void);
	CExpressionCell(int type);
	~CExpressionCell(void);
	virtual void GetVal(char &val)const;
	virtual void SetVal(char *val);
private:
	void CalculateCell(void);
	char *Value;
};
А вот сама прога,
берет ввод с клавиатуры и набивает определенные очереди определенными значениями.
Потом создается карта с указателями...
Код: plaintext
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
string get_cell_ref(int r,int c)
{
string abc="ABCDEFJIKLMNOPRSTUVWXYZ";	//max 26rows
string cell_ref(abc,c, 1 );	//get letter
char tmp[ 100 ];				//max 100 cols
itoa(r,tmp, 10 );
cell_ref+=tmp;				//add digit
return cell_ref;
}
//-------------------------------------------------------------
//
//-------------------------------------------------------------
int main (int argc, char *argv[])
{
#define BUF_SIZE  255 
int cols,rows;
char buf[BUF_SIZE];
CCell *cell=NULL;

scanf("%d\t%d",&rows,&cols);

queue<CIntegerCell>		integer_queue;
queue<CTextCell>		text_queue;
queue<CExpressionCell>	expression_queue;
map<string,CCell *>		table;

for(int i= 1 ;i<=rows;i++)
{
	for(int j= 0 ;j<cols;j++)
	{
		scanf("%s",buf);
		switch(buf[ 0 ])
		{
		case '=':
			{
			CExpressionCell ex_c(EXPRESSION_CELL);
			expression_queue.push(ex_c);
			cell=&(expression_queue.back());
			cell->SetVal(buf);
			}
			break;
		case '\'"%s\t"':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
		case '0':
			{
				if(isdigit(*buf))
				{
			CIntegerCell i_c(INTEGER_CELL);
			integer_queue.push(i_c);
			cell=&(integer_queue.back());
			cell->SetVal(atoi(buf));
				}else{
					printf("#error:");
					printf(buf);
					printf("\n#error: Entered value is not digit!\n");
					}
			}
			break;
		default:
			printf("#error:");
			printf(buf);
			printf("\n#error: Entered value unexpected!\n");

		}//switch
	table.insert(pair<string,CCell *>(get_cell_ref(i,j),cell));
	}//for
}//for

//Printing table
map<string,CCell *>::iterator iter;
char tmp[BUF_SIZE];
for(int i= 1 ;i<=rows;i++)
{
	printf("\n");
	for(int j= 0 ;j<cols;j++)
	{
		iter=table.find(get_cell_ref(i,j));
		if(iter!=table.end()){cell=iter->second;}
		switch(cell->GetType())
		{
		case NULL_CELL:
			break;
		case INTEGER_CELL:
			int val;
			cell->GetVal(val);
			printf("%d\t",val);
			break;
		case TEXT_CELL:
			cell->GetVal(*tmp);
			printf("%s\t",tmp);
			break;
		case EXPRESSION_CELL:
			cell->GetVal(*tmp);
			printf("%s\t",tmp);
			break;
		}
	}
}

return  0 ;
}
...
Рейтинг: 0 / 0
26.07.2005, 10:09
    #33184132
Lexaux
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
Ну, если я не ошибаюсь то и вправду на лицо явная ошибка проектирования. Суть полиморфима в том что вы собираете общие интерфейне методы в один базовый класс, и делаете несколько разных (ну по ходу как минимум 2 реализации такого вот абстрактного в базовом метода), и потом, работая с ссылками на базовый, вы не заботитесь о том, какой из потомков находится по этой ссылке.
Вроде так.
Потом, вручную в коде осуществляется проверка условий для конкретного типа: if isInteger ...
Так вот, это, судя по всему, чисто учебное задание, и полиморфизм тут немного за уши притянут. А по поводу как заставить это работать - согласен с коллегами, надо делать параметризированные методы доступа.
...
Рейтинг: 0 / 0
26.07.2005, 12:39
    #33184653
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
немного дополню...

вообщето старайтесь ИЗБЕГАТЬ НЕ ТИПИЗИРОВАННОГО использования. Это ПОТЕНЦИАЛЬНАЯ ошибка. Уже это - есть то, что надо подправлять в Вашем коде. Как, т.е. приёмы программирования - тут опыт и ООП Вам поможет.

Ышо рекомендую взглянуть на книжку Джэфри Элджера (если ничего не попутал).

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
26.07.2005, 13:01
    #33184744
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
может так лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class CCell
{
    virtual string toString() const =  0 ;
}
class CIntCell
{
private:
    int intVal;
public:
    virtual string toString() const
    { return IntToStr(intVal); }
}

class CTextCell
{
private:
    string strVal;
public:
    virtual string toString() const
    { return strVal; }
}

Дело в том что клиент этих cell'ов будет уметь отображать что-то, что может быть представленно в виде строки...
...
Рейтинг: 0 / 0
26.07.2005, 13:02
    #33184749
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка
забыл наследование... надо вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class CCell
{
    virtual string toString() const =  0 ;
}
class CIntCell: public CCell
{
private:
    int intVal;
public:
    virtual string toString() const
    { return IntToStr(intVal); }
}

class CTextCell: public CCell
{
private:
    string strVal;
public:
    virtual string toString() const
    { return strVal; }
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]