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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2010, 13:11   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Передача ссылки в функцию класса на данный класс

Доброго времени суток уважаемые эксперты. Для начала поздравляю всех с праздниками.
Ну а теперь к делу. Необходимо передать в функцию класса ссылку на другую переменную такого же класса (сам бы никогда не понял что тут написал). Собственно вот так:
Код:
class CNeuronLayer									
{
public:
	CNeuronLayer();
	void Create(int,const CNeuronLayer &);
	int GetCount();							
	~CNeuronLayer();
private:
	int kolNeuron;				
	CNeuron *neuron;
};
А вот как я описываю данную функцию:
Код:
void CNeuronLayer::Create(int KolNeuron,const CNeuronLayer &PredLayer)
{
	this->kolNeuron = KolNeuron;
	if (PredLayer.GetCount() != 0)
	{
		this->neuron = new CNeuron[KolNeuron];
		for(int i=0; i<KolNeuron; i++)
		{
			this->neuron[i].Create(PredLayer.GetCount());
		}
	}
}
Все бы ничего, но в итоге я получаю данную ошибку в двух местах:
Код:
error C2662: 'GetCount' : cannot convert 'this' pointer from 'const class CNeuronLayer' to 'class CNeuronLayer &'
        Conversion loses qualifiers
Без константы я получаю ошибку линковщика:
Код:
error LNK2001: unresolved external symbol "public: int __thiscall CNeuronLayer::GetCount(void)" (?GetCount@CNeuronLayer@@QAEHXZ)
Собственно весь вопрос состоит в том, чтобы узнать как решить мою проблему. Заранее спасибо.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 09.01.2010, 14:37   #2
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

в функцию Create передается константная ссылка на обьект, а внутри этой ф-ии у этого обьекта вызывается неконстантная функция:
if (PredLayer.GetCount() != 0)

Чтобы это вылечить, надо ф-ию GetCount обьявить константной:
void Create(int,const CNeuronLayer &) const;

Судя по второй ошибке (ошибка линковки) нигде не определена сама ф-ия GetCount. Ее надо определить.

Последний раз редактировалось _Ч_; 09.01.2010 в 14:41.
_Ч_ вне форума Ответить с цитированием
Старый 09.01.2010, 14:45   #3
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

this->kolNeuron и this->neuron[i] - вот тут this-> можно не писать.

Плюс ко всему вероятны еще утечки памяти. Сам класс как-то криво сделан. Но это уже другая история

Последний раз редактировалось _Ч_; 09.01.2010 в 14:47.
_Ч_ вне форума Ответить с цитированием
Старый 09.01.2010, 15:04   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от _Ч_ Посмотреть сообщение
Чтобы это вылечить, надо ф-ию GetCount обьявить константной:
void Create(int,const CNeuronLayer &) const;
Я так понимаю - это просто опечатка
Все с этим разобрался - все замечательно заработало.
А можно уточнить почему тут будет утечка памяти и почему класс криво написан (хочется все же правильно написать)
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 09.01.2010, 15:15   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

нет. это не опечатка. ф-ия Create изменяет состояние обьекта (this->kolNeuron = KolNeuron) поэтому она не может быть константной. константкая именно GetCount
_Ч_ вне форума Ответить с цитированием
Старый 09.01.2010, 15:24   #6
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от _Ч_ Посмотреть сообщение
нет. это не опечатка. ф-ия Create изменяет состояние обьекта (this->kolNeuron = KolNeuron) поэтому она не может быть константной. константкая именно GetCount
Я это знаю, просто вы написали Create(int,const CNeuronLayer &) const; а не GetCount() const;. Но не в этом дело. С этой своей ошибкой я уже справился. Хотелось бы все таки узнать: в каком месте произойдет утечка памяти?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 09.01.2010, 15:25   #7
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

зачем ф-ии void CNeuronLayer::Create(int KolNeuron,const CNeuronLayer &PredLayer) нужен const CNeuronLayer &PredLayer? чтобы позвать у него GetCount()? почему просто нельзя передвать это количество. (тут была глупость. удалил :-) )
Счетчики обьектов должны имень беззнаковый тип (unsigned например). Ведь количество обьектов не может быть отрицательным.
Это лишь вершина айсберга.
Чтобы написать правильно класс надо сперва описать для чего он нужен, что он делает. А так я вижу что он кривой, но как его сделать правильным я не знаю потому что не знаю для чего он.

Про утечку:
Что будет если два раза позвать ф-ию Create? правильно, будет утечка.

А что будет если я скопирую один обьект CNeuronLayer в другой? Если деструктор написан правильно, то потом может случится трындец.

Последний раз редактировалось _Ч_; 09.01.2010 в 15:53.
_Ч_ вне форума Ответить с цитированием
Старый 09.01.2010, 15:26   #8
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Упс. void Create(int,const CNeuronLayer &) const; - да, это опечатка
_Ч_ вне форума Ответить с цитированием
Старый 09.01.2010, 15:53   #9
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Чтобы написать правильно класс надо сперва описать для чего он нужен, что он делает. А так я вижу что он кривой, но как его сделать правильным я не знаю потому что не знаю для чего он.
Начну с этого. Класс является промежуточным между классом нейрон и классом нейронная сеть. Собственно он просто должен обеспечить связь нейронов в один слой, и обеспечить удобный доступ к ним.

Цитата:
зачем ф-ии void CNeuronLayer::Create(int KolNeuron,const CNeuronLayer &PredLayer) нужен const CNeuronLayer &PredLayer? чтобы позвать у него GetCount()? почему просто нельзя передвать это количество.
Признаюсь, сперва я так и планировал, но: тут довольно интересный момент - в процессе работы нейронной сети в слои могут добавляться (либо, что маловероятно, удаляться) нейроны, что, в свою очередь, приведет к автоматической переконфигурации всей сети. В любом случае понадобится дописывать Create (либо писать дополнительную функцию), но так мне будет удобнее брать параметры из предыдущего слоя.

Цитата:
А что будет если KolNeuron > PredLayer.GetCount()?
Так скорее всего и будет. Но, как вы должно быть заметили, KolNeuron - передается в функцию Create класс CNeuron, где он спокойненько себе обрабатывается.
Простите если ввел в заблуждения не приведя реализацию CNeuron

Цитата:
Счетчики объектов должны иметь беззнаковый тип (unsigned например). Ведь количество объектов не может быть отрицательным.
Вот с этим согласен на все 100%. Уже исправил.

Может есть еще какие-нибудь замечания?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 09.01.2010, 15:57   #10
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

ок. подумайте пока над этим:
Про утечку:
Что будет если два раза позвать ф-ию Create? правильно, будет утечка.

А что будет если я скопирую один обьект CNeuronLayer в другой? Если деструктор написан правильно, то потом может случится трындец.

Я пока остальное не осилил.
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос данных из класса в класс zexak Общие вопросы по Java, Java SE, Kotlin 2 27.02.2010 20:03
Си++. Передача массива в функцию. Diamond2107 Помощь студентам 7 03.12.2009 20:15
Передача массива в функцию D[I]K Общие вопросы C/C++ 4 13.09.2009 21:31
передача массива в функцию JOFRIF Общие вопросы C/C++ 8 02.08.2009 12:46
Передача массива в функцию Vistar Общие вопросы C/C++ 1 27.04.2009 08:08