Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перегрузкой опер. у класса от vector<> 
:(
    Опции темы
Elfet
Дата 18.1.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Приветствую! 

Пожалуйста, помогите разобраться почему следующий код не работает:
Physical.h:
Код

#ifndef PHYSICAL_H
#define PHYSICAL_H
#include "../main.h"

// Физические переменные

class Physical : public vector<double>
{
public:
    Physical()
        : vector<double>()
    { }
    Physical(size_t size)
        : vector<double>(size)
    { }

    string ToString()
    {
        std::stringstream oss;
        oss << "Physical( ";
        for(unsigned i = 0; size(); i++)
        {
            oss << i << ": " << at(i) << " ;";
        }
        oss << " )";
        return oss.str();
    }

    friend Physical operator+(Physical ob1, Physical ob2);
    friend Physical operator-(Physical ob1, Physical ob2);
    friend Physical operator*(Physical ob1, double scale);
    friend Physical operator*(double scale, Physical ob1);
    friend Physical operator/(Physical ob1, double scale);
    friend Physical operator/(double scale, Physical ob1);
};

Physical operator+(Physical ob1, Physical ob2)
{
    Physical phy(ob1.size());
    for(unsigned i = 0; ob1.size(); i++)
    {
        phy[i] = ob1[i] + ob2[i];
    }

    return phy;
}

Physical operator-(Physical ob1, Physical ob2)
{
    Physical phy(ob1.size());
    for(unsigned i = 0; ob1.size(); i++)
    {
        phy[i] = ob1[i] - ob2[i];
    }

    return phy;
}

Physical operator*(Physical ob1, double scale)
{
    Physical phy(ob1.size());
    for(unsigned i = 0; ob1.size(); i++)
    {
        phy[i] = ob1[i] * scale;
    }

    return phy;
}

Physical operator*(double scale, Physical ob1)
{
    return ob1 * scale;
}

Physical operator/(Physical ob1, double scale)
{
    Physical phy(ob1.size());
    for(unsigned i = 0; ob1.size(); i++)
    {
        phy[i] = ob1[i] * scale;
    }

    return phy;
}

Physical operator/(double scale, Physical ob1)
{
    return ob1 / scale;
}


#endif // PHYSICAL_H


Компилируется и выдаёт следующие ошибки:
Цитата

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -shared -mthreads -Wl -Wl,--out-implib,debug\libsmartflowlib1.a -o debug\smartflowlib1.dll object_script.smartflowlib.Debug -L"d:\Qt\2009.05\qt\lib" debug\smartflowlib_resource_res.o ./libs/libboost_serialization.a ./libs/libLinAlg.a -lQtCored4
./debug\Solver.o: In function `Zpl8PhysicalS_':
d:/qt/2009.05/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/new:101: multiple definition of `operator+(Physical, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:38: first defined here
./debug\Solver.o: In function `Zmi8PhysicalS_':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:49: multiple definition of `operator-(Physical, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:49: first defined here
./debug\Solver.o: In function `Zml8Physicald':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:60: multiple definition of `operator*(Physical, double)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:60: first defined here
./debug\Solver.o: In function `Zmld8Physical':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:71: multiple definition of `operator*(double, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:71: first defined here
./debug\Solver.o: In function `Zdv8Physicald':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:76: multiple definition of `operator/(Physical, double)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:76: first defined here
./debug\Solver.o: In function `Zdvd8Physical':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:87: multiple definition of `operator/(double, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:87: first defined here
./debug\Mesh.o: In function `Zpl8PhysicalS_':
d:/qt/2009.05/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/new:101: multiple definition of `operator+(Physical, Physical)'
Creating library file: debug\libsmartflowlib1.a
mingw32-make[1]: Leaving directory `D:/Qt/smart-flow/SmartFlowLib'
mingw32-make: Leaving directory `D:/Qt/smart-flow/SmartFlowLib'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:38: first defined here
./debug\Mesh.o: In function `Zmi8PhysicalS_':
D:\Qt\smart-flow\SmartFlowLib/Source//Physical.h:49: multiple definition of `operator-(Physical, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:49: first defined here
./debug\Mesh.o: In function `Zml8Physicald':

.......................

./debug\ImportGambit.o: In function `Zdv8Physicald':
D:\Qt\smart-flow\SmartFlowLib/Source/Imports//../Physical.h:76: multiple definition of `operator/(Physical, double)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:76: first defined here
./debug\ImportGambit.o: In function `Zdvd8Physical':
D:\Qt\smart-flow\SmartFlowLib/Source/Imports//../Physical.h:87: multiple definition of `operator/(double, Physical)'
./debug\smartflowlib.o:D:\Qt\smart-flow\SmartFlowLib/Source/Physical.h:87: first defined here
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\smartflowlib1.dll] Error 1
mingw32-make: *** [debug] Error 2
Завершено с кодом возврата 2.
Ошибка во время сборки проекта SmartFlowLib
Во время выполнения сборки на этапе 'Make'


Якобы  multiple definition, хотя в подключаю это h-файл только в одном месте.  smile  smile  smile 

Заранее спасибо! 


--------------------
PM MAIL WWW Skype   Вверх
MTWizard
Дата 18.1.2010, 23:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: 3
Всего: 4



Сделай операторы inline
PM MAIL   Вверх
Elfet
Дата 18.1.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



MTWizard,  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 


--------------------
PM MAIL WWW Skype   Вверх
zim22
Дата 19.1.2010, 11:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Elfet @  18.1.2010,  21:57 Найти цитируемый пост)
class Physical : public vector<double>

Elfet, я бы на твоём месте использовал вектор в отношении "has-a" по отношению к твоему классу, а не "is-a".
т.е. так:
Код

class Physical {
  std::vector<double> vd;
};

***
Цитата(Elfet @  18.1.2010,  21:57 Найти цитируемый пост)
Physical operator+(Physical ob1, Physical ob2){    
  Physical phy(ob1.size());    
  for(unsigned i = 0; ob1.size(); i++)    {        
    phy[i] = ob1[i] + ob2[i];    
  }   
 return phy;
}

вечный цикл?
 for(unsigned i = 0; ob1.size(); i++)    {        


Это сообщение отредактировал(а) zim22 - 19.1.2010, 12:09


--------------------
PM MAIL   Вверх
saneea
Дата 19.1.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: 1
Всего: 0



Можно было просто реализацию перегрузок операторов запихнуть в .cpp файл.
PM MAIL   Вверх
Earnest
Дата 20.1.2010, 20:23 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(zim22 @  19.1.2010,  12:30 Найти цитируемый пост)
Elfet, я бы на твоём месте использовал вектор в отношении "has-a" по отношению к твоему классу, а не "is-a".

Elfet, прислушайся к этому совету. Наследовать стандартные контейнеры - очень дурной тон. 


--------------------
...
PM   Вверх
Elfet
Дата 20.1.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



zim22, да, спасибо. Цикл поправлю. 

А в чём дурной? Мне то нужно было всего навсего что бы операции выполнялись + toString()


--------------------
PM MAIL WWW Skype   Вверх
Earnest
Дата 21.1.2010, 08:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Читай труды отцов типа Майерса. Вообще наследование от конкретного (не абстрактного) класса - это плохо в долгострочной перспективе (развития программы). Чтобы хорошенько проняло, надо поподдерживать какой-нибудь большой проект лет 5-10. А пока просто поверь и вырабатывай правильные привычки. Желание использовать готовую функциональность какого-либо класса - это совершенно недостаточный повод для наследования. Твой Physical - это не вектор даблов, он просто может быть построен на основе вектора даблов (а может и на чем-то другом). А это совсем другое дело.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1236 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.