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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2020, 01:39   #1
jonn342
Пользователь
 
Регистрация: 26.01.2020
Сообщений: 13
Вопрос создал экземпляр класса MultiThread mt со значением 3. Как эту 3 передать в перегруженный оператор умножения.

Доброй ночи всем не спящим! У меня такой вопрос.
Есть 3 единицы трансляции:main.cpp, foo.cpp и foo.h.
Код в них следующий:

main.cpp
Код:
int main(){
     MultiThread mt(3);
     Matrix matrix m1,m2,res;
     //заполняем матрицы m1 и m2
     res = m1 * m2;
}
foo.h
Код:
//Обёртка над классом std::thread

class MultiThread{
protected:
   int num;                                                   //количество потоков
   std::thread thr;                                         //экземпляр класса поток
public:
   MultiThread():num(0)                                //Количество потоков 0 по-умолчанию
   MultiThread(int x):num(x){}                      //Задаём количество потоков
};


class Matrix : public MultiThread{
   std::vector< std::vector<int>>mt;             //матрица
public:
   void fillMatrix();                                         //заполняем матрицу
   friend Matrix operator*(Matrix &, Matrix &); //перегружаем оператор умножения
   Matrix operator=(Matrix &);
};
foo.cpp
Код:
void Matrix::fillMatrix(){
     //Заполняем матрицу
}

Matrix operator=(Matrix & obj){
    mt = obj.mt;
    return *this;
}

Matrix operator*(Matrix & a, Matrix & b){
     //!!!Тут вопрос!!!
     if(MultiThread::num > 0){
              //Перемножаем с учётом потоков
     }
     else{
             //Умножаем матрицы в штатном режиме
     }
}
Собственно, вопрос. В main.cpp я создал экземпляр класса MultiThread mt со значением 3. Как эту 3 передать в перегруженный оператор умножения. Я полагаю, что можно как-то сделать через наследование классов, но ничего на ум, кроме глобальных переменных не приходит, а это дурной тон, не хотелось бы так писать.
jonn342 вне форума Ответить с цитированием
Старый 27.05.2020, 08:22   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от jonn342 Посмотреть сообщение
Есть 3 единицы трансляции:main.cpp, foo.cpp и foo.h.
здесь только две единицы трансляции


Цитата:
Сообщение от jonn342 Посмотреть сообщение
создал экземпляр класса MultiThread mt со значением 3
точнее - "создал экземпляр класса MultiThread и инициализировал значением 3 "

Цитата:
Сообщение от jonn342 Посмотреть сообщение
Как эту 3 передать
так нужно mt передать или 3 ? Что-то я запутался )

а вообще, эта переменная и так доступна. Варианты обращения в этом операторе:

a.num
b.num

Но! Поскольку оператор объявлен как friend , его тело нельзя выносить из описания класса.
Код:
class Matrix : public MultiThread
{
...
...
  friend Matrix operator*(Matrix & a, Matrix & b)//глобальная функция-оператор
  {
     if(a.num!=b.num)
     {
         //обработать ситуацию
     }

     if(a.num > 0){
              //Перемножаем с учётом потоков
     }
     else{
             //Умножаем матрицы в штатном режиме
     }
    
     //и надо ещё не забыть вернуть объект типа Matrix
     return ...;
  }
...
...

};

Последний раз редактировалось Алексей1153; 27.05.2020 в 08:25.
Алексей1153 вне форума Ответить с цитированием
Старый 27.05.2020, 08:27   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

и ещё ошибка. Определение оператора = :

Matrix Matrix::operator=(Matrix & obj){
mt = obj.mt;
return *this;
}
Алексей1153 вне форума Ответить с цитированием
Старый 27.05.2020, 11:01   #4
jonn342
Пользователь
 
Регистрация: 26.01.2020
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
здесь только две единицы трансляции



точнее - "создал экземпляр класса MultiThread и инициализировал значением 3 "


так нужно mt передать или 3 ? Что-то я запутался )

а вообще, эта переменная и так доступна. Варианты обращения в этом операторе:

a.num
b.num

Но! Поскольку оператор объявлен как friend , его тело нельзя выносить из описания класса.
Код:
class Matrix : public MultiThread
{
...
...
  friend Matrix operator*(Matrix & a, Matrix & b)//глобальная функция-оператор
  {
     if(a.num!=b.num)
     {
         //обработать ситуацию
     }

     if(a.num > 0){
              //Перемножаем с учётом потоков
     }
     else{
             //Умножаем матрицы в штатном режиме
     }
    
     //и надо ещё не забыть вернуть объект типа Matrix
     return ...;
  }
...
...

};
Поле то доступно. Только, как я понимаю, мы будем иметь в случае a.num и b.num неинициализированные переменные. Т.е. чтобы так обратиться, я полагаю, нужно переменную num обьявить, как static.
jonn342 вне форума Ответить с цитированием
Старый 27.05.2020, 14:31   #5
jonn342
Пользователь
 
Регистрация: 26.01.2020
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Но! Поскольку оператор объявлен как friend , его тело нельзя выносить из описания класса.
Код:
class Matrix : public MultiThread
{
...
...
  friend Matrix operator*(Matrix & a, Matrix & b)//глобальная функция-оператор
  {
     if(a.num!=b.num)
     {
         //обработать ситуацию
     }

     if(a.num > 0){
              //Перемножаем с учётом потоков
     }
     else{
             //Умножаем матрицы в штатном режиме
     }
    
     //и надо ещё не забыть вернуть объект типа Matrix
     return ...;
  }
...
...

};
А почему нельзя выносить за пределы класса?
jonn342 вне форума Ответить с цитированием
Старый 27.05.2020, 21:14   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от jonn342 Посмотреть сообщение
А почему нельзя выносить за пределы класса?
таковы правила языка. Убери friend и можно будет вынести - будет такая же глобальная функция
Алексей1153 вне форума Ответить с цитированием
Старый 27.05.2020, 21:18   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от jonn342 Посмотреть сообщение
Только, как я понимаю, мы будем иметь в случае a.num и b.num неинициализированные переменные
инициализируй - будут инициализированные.

а вообще - раз эта переменная подразумевается как константа, так и сделай её константой внутри класса (enum или enum class или static constexpr)

либо вообще шаблон с int параметром
Алексей1153 вне форума Ответить с цитированием
Старый 27.05.2020, 23:43   #8
jonn342
Пользователь
 
Регистрация: 26.01.2020
Сообщений: 13
По умолчанию

Алексей1153, не. Она подразумевается в моём случае статической переменной внутри класса. Это выглядит так:
Код:
struct MultiThread{
    static void setThread(int x):num(x)
protected:
    static int num;
    std::vector<std::thread> vt;
};

int MultiThread::num=0;

class MatrixMultiplication : public MultiThread{
...
};
Т.е. то, что мне было и нужно. Вроде бы имеем глобальную переменную, но в тоже время, она спрятана от всего мира внутри класса MultiThread и может быть передана классу-наследнику MatrixMultiplication, т.е. каждый экземпляр класса-наследника будет знать про количество потоков. Думаю, тему можно закрыть.
jonn342 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегруженный оператор вывода строки символов Tamarik Помощь студентам 0 26.01.2016 19:32
Сохранить экземпляр класса SkrudjMakdak Помощь студентам 0 23.10.2013 21:21
Экземпляр класса в теле класса. Mr_freeman PHP 4 15.04.2013 15:37
По id создать экземпляр класса. [MI_nor] Общие вопросы по Java, Java SE, Kotlin 3 12.05.2011 03:33
Экземпляр класса как параметр dzjundzja88 C# (си шарп) 7 17.02.2011 18:33