У вас есть определение функции с полным кодом в заголовке, который вы включаете в несколько модулей компиляции. Это приводит к тому, что функция определяется в каждом модуле компиляции (cpp), и это нарушает Правило единого определения (ODR) .
Включающие охранники следят за тем, чтобы одно и то же определение не встречалось несколько раз в одном и том же модуле компиляции (например, если вы включили function.hpp
в neuron.hpp
и также включили его напрямую). Но здесь этот заголовок прямо или косвенно включен в main.cpp
, ffnet.cpp
и neuron.cpp
, что дает первое определение и 2 недопустимых переопределения.
Необходимо изменить function.hpp
, чтобы оставить только объявление функции:
#ifndef FUNCTIONS_HPP
#define FUNCTIONS_HPP
double random_double(); // no body !!
#endif
и переместить тела функций в отдельный function.cpp
, который должен быть добавленным к вашей команде компилятора.
Преимущество этого подхода:
Не уверен, что это применимо, но имейте в виду, что не стоит включать заголовок в пространство имен.
Я также рекомендую прочитать эту статью о заголовках . Это старый, но совет все еще очень актуален: -)
Обратите внимание, что существуют исключения из ODR для классов и встроенных функций, и в этом случае множественные определения должны быть точно такой же последовательностью токенов.
Вот эталонный тест с хранимой процедурой по сравнению с php.
http://mtocker.livejournal.com/45222.html
Хранимая процедура была медленнее в 10 раз.
Вы может также захотеть посмотреть на это:
http://www.tonymarston.net/php-mysql/stored-procedures-are-evil.html
Если причина, по которой вы думаете об этом, связана с производительностью и масштабируемостью, то я бы порекомендовал продолжить вычисления в PHP.
Причина этого заключается в том, что независимо от того, есть ли снижение производительности в вашем PHP, когда когда вы масштабируете свое веб-приложение, обычно гораздо проще перейти на несколько веб-серверов, чем на несколько серверов баз данных. Поэтому предпочтительно делать больше вычислений в PHP и меньше в MySQL.
Кроме аспекта производительности, Я все же обычно предпочитаю избегать хранимых процедур в пользу наличия логики в приложении, потому что она может быть менее переносимой. Хранимая процедура добавляет усилий, необходимых для развертывания нового экземпляра вашего приложения.
Конечно, все эти проблемы можно решить без особых сложностей, если вы хотите использовать хранимые процедуры.
Короче, держите их в php. Проще поддерживать.
Для текущего сайта вряд ли когда-либо случится проблема с производительностью, когда разница между скоростью calc в php и скоростью calc в базе данных когда-либо заметна. Если бы вы были, значит, что-то в корне не так с кодом сайта. (Это включает в себя конвертацию валюты в реальном времени, если это будет сделано.)
Говоря, что хранение калькуляции в PHP обычно предпочтительнее, так как ее легче контролировать и отлаживать. Это требует, чтобы веб-кодеры немного знали базу данных, но обычно это не проблема. 90% ускорений кода происходит на 10% кода, и для dba было бы достаточно легко идентифицировать запросы, вызывающие загрузку db, если это когда-либо произойдет.
Если это абсолютно необходимо обновлять цены при каждом запросе страницы, и вы беспокоитесь, что на сайт будет приходить много трафика, я бы не рекомендовал хранимые процедуры.
Я бы рекомендовал кэшировать информацию, которую вы используете (и это сложно не вдаваясь в подробности, не зная, как вы это делаете) в памяти (возможно, с использованием memcached) и продолжайте читать ее из PHP.
Я признаю, что я не делал никаких сравнений между хранимыми процедурами и производительностью PHP в памяти, но если процедура неt напрямую влияет на ваш запрос, я рекомендую кэшировать.