powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка
10 сообщений из 10, страница 1 из 1
перегрузка
    #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
перегрузка
    #33182956
synapse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам придумал
привел во всех функция возвращаемый параметр к void а если нужно что то вернуть то передаю ссылку на переменную в которую нужно возвратить результат.
вот теперь заработало весь полиморфизм...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
перегрузка
    #33183085
stm_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
synapseСам придумал
привел во всех функция возвращаемый параметр к void а если нужно что то вернуть то передаю ссылку на переменную в которую нужно возвратить результат.
вот теперь заработало весь полиморфизм...


Это метод C, а в C++ надо использовать параметризированные(шаблонные)
функции/классы.
...
Рейтинг: 0 / 0
перегрузка
    #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
перегрузка
    #33183601
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
synapse

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

imho налицо ошибка в проектировании... вы бы рассказали что это за классы и для чего они используются!
...
Рейтинг: 0 / 0
перегрузка
    #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
перегрузка
    #33184132
Lexaux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, если я не ошибаюсь то и вправду на лицо явная ошибка проектирования. Суть полиморфима в том что вы собираете общие интерфейне методы в один базовый класс, и делаете несколько разных (ну по ходу как минимум 2 реализации такого вот абстрактного в базовом метода), и потом, работая с ссылками на базовый, вы не заботитесь о том, какой из потомков находится по этой ссылке.
Вроде так.
Потом, вручную в коде осуществляется проверка условий для конкретного типа: if isInteger ...
Так вот, это, судя по всему, чисто учебное задание, и полиморфизм тут немного за уши притянут. А по поводу как заставить это работать - согласен с коллегами, надо делать параметризированные методы доступа.
...
Рейтинг: 0 / 0
перегрузка
    #33184653
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного дополню...

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

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

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
перегрузка
    #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
перегрузка
    #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
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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