Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
veles123
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 83
Завершенные тесты: 1
1

Конструктор класса, конструктор копирования запускается не тот который нужен

17.11.2017, 01:56. Просмотров 246. Ответов 5

Есть такой конструктор:
C++
1
2
3
4
5
6
7
8
9
10
Neuron::Neuron(int iType_activation_funk)   {
    this->iType_act = iType_activation_funk;
    switch (iType_activation_funk) {
    case 0: this->dfActivate = &this->dfLineFunc(tInnerInActivateFunc); break;
    case 1: this->dfActivate = &this->dfLineFuncWithSat(tInnerInActivateFunc);  break;
    case 2: this->dfActivate = &this->dfStepFunc(tInnerInActivateFunc); break;
    case 3: this->dfActivate = &this->dfLogisticFunc(tInnerInActivateFunc); break;
    case 4: this->dfActivate = &this->dfHyperbolicTangent(tInnerInActivateFunc);    break;
    default: this->dfActivate = &this->dfLineFunc(tInnerInActivateFunc);    break;
    }
И есть такой:
C++
1
2
3
4
5
Neuron::Neuron(const Neuron *n) {
    this->dfActivate = n->dfActivate;
    this->iType_act = n->iType_act;
    this->t = n->t;
}
При запуске этого куска
C++
1
2
int  b = 0;
    Neuron *n = new Neuron(b);
выдает ошибку

C++
1
Ошибка  C2664   "Neuron::Neuron(const Neuron &)": невозможно преобразовать аргумент 1 из "int" в "const Neuron &"
Т.е. запускает конструктор с аргументом const Neuron &n а не int iType_activation_funk

Почему не запускается конструктор с аргументои типа int и как это исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2017, 01:56
Ответы с готовыми решениями:

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include...

Конструктор копирования шаблонного класса
Всем доброго времени суток! Язык С++ изучаю относительно недавно и столкнулся с задачей, которую не...

Создать конструктор копирования класса
Помогите создать конструктор копирования класса. Мне надо чтоб я в основной программе нажимал...

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

5
Mournful Max
Велосипедист...
347 / 214 / 74
Регистрация: 15.12.2015
Сообщений: 784
Завершенные тесты: 1
17.11.2017, 02:38 2
Цитата Сообщение от veles123 Посмотреть сообщение
C++
1
Neuron::Neuron(const Neuron *n)
Это не конструктор копирования. Вот так он должен выглядеть:
C++
1
Neuron::Neuron( const Neuron& n )
Цитата Сообщение от veles123 Посмотреть сообщение
Почему не запускается конструктор с аргументои типа int и как это исправить?
Скиньте весь код.
0
veles123
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 83
Завершенные тесты: 1
17.11.2017, 13:38  [ТС] 3
main.h
C++
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
#pragma once
 
 
    class Neuron
    {
    public:
        //template <typename tInnerInActivateFunc>
        double(*dfActivate)(int);//(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        Neuron(int);
        Neuron(const Neuron&);
        ~Neuron();
        int iType_act;
 
    private:
        double t;//смотри в википедии в определениии линейной функции
        template <typename tInnerInActivateFunc>
        static double dfLineFunc(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        static double dfLineFuncWithSat(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        static double dfStepFunc(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        static double dfSigmoidFunc(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        static double dfLogisticFunc(tInnerInActivateFunc);
        template <typename tInnerInActivateFunc>
        static double dfHyperbolicTangent(tInnerInActivateFunc);
    };
main.cpp

C++
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
#include "main.h"
#include <cmath>
 
//class Neuron
 
 
template <typename tInnerInActivateFunc>
/*0 - линейная передаточная функция;
1 - линейная с насыщением;
2 - пороговая передаточная функция
3 - сигмоидальная передаточная функция
4 - логистическая функция
5 - гиперболический тангенс*/
Neuron::Neuron(int iType_activation_funk)   {
    this->iType_act = iType_activation_funk;
    switch (iType_activation_funk) {
    case 0: this->dfActivate = &this->dfLineFunc(tInnerInActivateFunc); break;
    case 1: this->dfActivate = &this->dfLineFuncWithSat(tInnerInActivateFunc);  break;
    case 2: this->dfActivate = &this->dfStepFunc(tInnerInActivateFunc); break;
    case 3: this->dfActivate = &this->dfLogisticFunc(tInnerInActivateFunc); break;
    case 4: this->dfActivate = &this->dfHyperbolicTangent(tInnerInActivateFunc);    break;
    default: this->dfActivate = &this->dfLineFunc(tInnerInActivateFunc);    break;
    }
 
}
 
Neuron::Neuron(const Neuron &n) {
    this->dfActivate = n->dfActivate;
    this->iType_act = n->iType_act;
    this->t = n->t;
}
 
Neuron::~Neuron()   {
}
 
template <typename tInnerInActivateFunc>
// линейная передаточная функция
double Neuron::dfLineFunc(tInnerInActivateFunc X) {
    return X* this->t;
}
 
template <typename tInnerInActivateFunc>
// линейная с насыщением
double Neuron::dfLineFuncWithSat(tInnerInActivateFunc X) {
    if (x <= 0) return 0;
    else if (x >= 1) return 1;
    else return x;
}
 
template <typename tInnerInActivateFunc>
// пороговая передаточная функция
double Neuron::dfStepFunc(tInnerInActivateFunc X) {
    return (X >= this->t) : 1 ? 0;
}
 
template <typename tInnerInActivateFunc>
//сигмоидная передаточная функция. пока не реализована
double Neuron::dfSigmoidFunc(tInnerInActivateFunc) {
    return 0;
}
 
template <typename tInnerInActivateFunc>
//логистическая функция
double Neuron::dfLogisticFunc(tInnerInActivateFunc X) {
    return 1 / (1 + exp(-t*x));
}
 
template <typename tInnerInActivateFunc>
//гиперболический тангенс
double Neuron::dfHyperbolicTangent(tInnerInActivateFunc X) {
    return (exp(this->t*X) - exp(-this->t*X)) / (exp(this->t*X) + exp(-this->t*X));
}
Если
C++
1
2
3
4
5
Neuron::Neuron(const Neuron &n) {
    this->dfActivate = n->dfActivate;
    this->iType_act = n->iType_act;
    this->t = n->t;
}
То пишет Error
C++
1
E0044   выражение должно иметь тип указателя     d:\newneural\main.cpp  29
Вот сюда
C++
1
    this->dfActivate = n->dfActivate;
и на следующие строки.

Добавлено через 7 минут
Изменил так


C++
1
2
3
4
5
Neuron::Neuron(const Neuron &n) {
    this->dfActivate = n.dfActivate;
    this->iType_act = n.iType_act;
    this->t = n.t;
}
Компилятор жалуется при вызове

C++
1
2
int  b = 0;
    Neuron *n = new Neuron(b);
C++
1
Ошибка  C2664   "neural_network_lib::Neuron::Neuron(const neural_network_lib::Neuron &)": невозможно преобразовать аргумент 1 из "int" в "const neural_network_lib::Neuron &"   support 9
Добавлено через 1 час 49 минут
Изменил класс, теперь ни одного template

C++
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
    class Neuron
    {
    public:
        //template <typename tInnerInActivateFunc>
        double(*dfActivate)(double);//(tInnerInActivateFunc);
        //template <typename tInnerInActivateFunc>
        Neuron(int);
        Neuron(const Neuron&);
        ~Neuron();
        int iType_act;
 
    private:
        double t;
        
         double dfLineFunc(double);
        
         double dfLineFuncWithSat(double);
        
         double dfStepFunc(double);
    
         double dfSigmoidFunc(double);
        
         double dfLogisticFunc(double);
        
         double dfHyperbolicTangent(double);
    };
Теперь проблема здесь

C++
1
2
3
4
5
6
7
8
9
10
11
12
Neuron::Neuron(/*const int &*/int iType_activation_funk)    {
    this->iType_act = iType_activation_funk;
    switch (iType_activation_funk) {
    case 0: this->dfActivate = &this->dfLineFunc;   break;
    case 1: this->dfActivate = &this->dfLineFuncWithSat;    break;
    case 2: this->dfActivate = &this->dfStepFunc;   break;
    case 3: this->dfActivate = &this->dfLogisticFunc;   break;
    case 4: this->dfActivate = &this->dfHyperbolicTangent;  break;
    default: this->dfActivate = &this->dfLineFunc;  break;
    }
 
}
C++
1
Ошибка  C2276   &: недопустимая операция с выражением привязанной функции-члена support 18
0
skope50
0 / 0 / 2
Регистрация: 03.06.2016
Сообщений: 7
17.11.2017, 16:26 4
По последней ошибке: в switch блоке уберите все '&': не нужно брать адрес, так как вы указателю присваиваете указатель.
0
veles123
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 83
Завершенные тесты: 1
17.11.2017, 16:30  [ТС] 5
Без взятия адреса
C++
1
Ошибка  C3867   "neural_network_lib::Neuron::dfLineFunc": нестандартный синтаксис; используйте "&", чтобы создать указатель на член support d:\newneural\main.cpp   18
0
Mournful Max
Велосипедист...
347 / 214 / 74
Регистрация: 15.12.2015
Сообщений: 784
Завершенные тесты: 1
18.11.2017, 00:58 6
Врать не буду. Код ужасен, непонятен... Там дело даже не в
Цитата Сообщение от veles123 Посмотреть сообщение
Компилятор жалуется при вызове
C++
1
2
int *b = 0;
Neuron *n = new Neuron(b);
---- ----
Цитата Сообщение от veles123 Посмотреть сообщение
Теперь проблема здесь
C++
1
2
3
4
5
6
7
8
9
10
11
12
Neuron::Neuron(/*const int &*/int iType_activation_funk)    {
    this->iType_act = iType_activation_funk;
    switch (iType_activation_funk) {
    case 0: this->dfActivate = &this->dfLineFunc;   break;
    case 1: this->dfActivate = &this->dfLineFuncWithSat;    break;
    case 2: this->dfActivate = &this->dfStepFunc;   break;
    case 3: this->dfActivate = &this->dfLogisticFunc;   break;
    case 4: this->dfActivate = &this->dfHyperbolicTangent;  break;
    default: this->dfActivate = &this->dfLineFunc;  break;
    }
 
}
Конечно здесь проблема... Почитайте хотя бы про указатели на функции. Думаю, оно должно было выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Neuron::Neuron(int iType_activation_funk)   {
    this->iType_act = iType_activation_funk;
    switch (iType_activation_funk) {
    case 0: this->dfActivate = dfLineFunc; break;
    case 1: this->dfActivate = dfLineFuncWithSat;  break;
    case 2: this->dfActivate = dfStepFunc; break;
    case 3: this->dfActivate = dfLogisticFunc; break;
    case 4: this->dfActivate = dfHyperbolicTangent;    break;
    default: this->dfActivate = dfLineFunc;    break;
    }
 
}
---- ----
Вот это вот вообще непонятно:
Цитата Сообщение от veles123 Посмотреть сообщение
C++
1
this->t = n->t;
Непонятно что такое t и где оно...
---- ----
Тут тоже:
Цитата Сообщение от veles123 Посмотреть сообщение
C++
1
2
3
4
5
template <typename tInnerInActivateFunc>
// линейная передаточная функция
double Neuron::dfLineFunc(tInnerInActivateFunc X) {
    return X* this->t;
}
---- -----
Цитата Сообщение от veles123 Посмотреть сообщение
C++
1
2
3
4
5
6
7
template <typename tInnerInActivateFunc>
// линейная с насыщением
double Neuron::dfLineFuncWithSat(tInnerInActivateFunc X) {
    if (x <= 0) return 0;
    else if (x >= 1) return 1;
    else return x;
}
Тут вообще x не объявлена.
---- ----
Ну и так далее... Кстати, в main.cpp даже main-функция не определена)
В общем... Пройдите обучающий курс по основам C++ заново.
0
18.11.2017, 00:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2017, 00:58

Конструктор копирования для класса стек
Почему не хочет работать конструктор копирования? struct Item { int value; Item *next;...

Cделать конструктор по умолчанию и копирования для класса
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const...

Объясните, зачем в коде нужен явный конструктор копирования
Добрый день, хочу понять код, почему тут обезательно надо явный конструктор копирования? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru