Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 08.03.2019
Сообщений: 52
1

Вызывается конструктор по умолчанию вместо конструктора с параметрами

28.06.2019, 13:37. Просмотров 1464. Ответов 6
Метки нет (Все метки)

Есть 2 конструктора:
C++
1
2
3
4
5
6
Cell::Cell()
{
    strcpy(PhoneTouchScreen,"Unknown");
    strcpy(PhoneTypeOfShell,"Unknown");
    strcpy(Identificator,"123CElLtE");
}
Это конструктор по умолчанию.
C++
1
Cell(char PhoneName[30],char PhoneFabricator[20],char PhoneColor[20],float PhoneWeight,int PhoneNumberOfSIMCards,float PhoneScreenDiagonal,char PhoneTouchScreen[12],char PhoneTypeOfShell[20]){}
А это с параметрами. В первом случае я описал конструктор в .cpp,а во втором в .h.
В работе реализовано дерево классов, поэтому в конструкторе по умолчанию только те параметры, которые относятся к классу Cell.А во втором конструкторе уже все параметры, начиная с базового класса.
Так вот, в некотором участке другого класса, который наследует класс, с этими конструкторами, я вызываю второй конструктор (с параметрами):
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
template <typename T>
int List<T>::LoadList1(const char* s)
{
    std::ifstream f("Phones.txt");
    if(!f.is_open())                                                    // Если файл не открывается, то
    {                                                                   // информируем об этом
        std::cout << "------------------------------------------------------------------------------------------------------------------------" << std::endl;
        std::cout << " Ошибка открытия файла!" << std::endl;
        return 0;                                                       // и возвращаем 0
    }
    int Count;
    f >> Count;
    for(int i = 0; i < Count; i++)
        {
            char Identificator[25];
            char PhoneName[30];
            char PhoneFabricator[20];
            char PhoneColor[20];
            float PhoneWeight;
            int PhoneNumberOfSIMCards;
            float PhoneScreenDiagonal;
            char PhoneTouchScreen[12];
            char PhoneTypeOfShell[20];
            f >> Identificator;
            if (strspn(Identificator,s)==strlen(Identificator))
                {
                    f >> PhoneName;
                    f >> PhoneFabricator;
                    f >> PhoneColor;
                    f >> PhoneWeight;
                    f >> PhoneNumberOfSIMCards;
                    f >> PhoneScreenDiagonal;
                    f >> PhoneTouchScreen;
                    f >> PhoneTypeOfShell;
            std::cout << strspn(Identificator,s) << std::endl; // Просто проверка того,что данные загружаются из файла
            std::cout << strlen(Identificator);
            std::cout << Identificator << std::endl;
            std::cout << PhoneName << std::endl;
            std::cout << PhoneFabricator << std::endl;
            std::cout << PhoneColor << std::endl;
            std::cout << PhoneWeight << std::endl;
            std::cout << PhoneNumberOfSIMCards << std::endl;
            std::cout << PhoneScreenDiagonal << std::endl;
            std::cout << PhoneTouchScreen << std::endl;
            std::cout << PhoneTypeOfShell << std::endl;
                    T* cell = new Cell (PhoneFabricator,PhoneName,PhoneColor,PhoneWeight,PhoneNumberOfSIMCards,PhoneScreenDiagonal,PhoneTouchScreen,PhoneTypeOfShell);
                    push_back(*cell);
                }
        }
    return 1;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2019, 13:37
Ответы с готовыми решениями:

Конструктор по умолчанию вызывается после конструктора инициализации
Во время выполнения программы потомок не может использовать матрицу, инициализированную в предке. Я...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по...

Конструктор с параметрами по умолчанию
пытаюсь создать класс с параметрами по умолчанию(я да, надеюсь, что я не путаюсь в терминах) ...

Классы и конструктор по умолчанию/с параметрами
Помогите пожалуйста! Необходимо сконструировать класс с заданным набором свойств. В данном случае,...

6
805 / 495 / 208
Регистрация: 19.01.2019
Сообщений: 1,194
28.06.2019, 22:17 2
Лучший ответ Сообщение было отмечено Денис73 как решение

Решение

Цитата Сообщение от Денис73 Посмотреть сообщение
Cell(char PhoneName[30],char PhoneFabricator[20],char PhoneColor[20],float PhoneWeight,int PhoneNumberOfSIMCards,float PhoneScreenDiagonal,char PhoneTouchScreen[12],char PhoneTypeOfShell[20]){}
Так он пустой.
1
491 / 206 / 69
Регистрация: 27.05.2016
Сообщений: 550
28.06.2019, 23:22 3
Цитата Сообщение от Денис73 Посмотреть сообщение
в некотором участке другого класса, который наследует класс, с этими конструкторами, я вызываю второй конструктор (с параметрами)
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
#include <iostream>
 
class Cell
{
public:
    Cell() { std::cout << "Cell() [1]" << std::endl; }
    Cell(char PhoneName[30], char PhoneFabricator[20], char PhoneColor[20], float PhoneWeight,
         int PhoneNumberOfSIMCards, float PhoneScreenDiagonal, char PhoneTouchScreen[12],
         char PhoneTypeOfShell[20])
    {
        std::cout << "Cell() [2]" << std::endl;
    }
};
 
class Derived : public Cell
{
public:
    void LoadList1() const
    {
        char Identificator[25];
        char PhoneName[30];
        char PhoneFabricator[20];
        char PhoneColor[20];
        float PhoneWeight;
        int PhoneNumberOfSIMCards;
        float PhoneScreenDiagonal;
        char PhoneTouchScreen[12];
        char PhoneTypeOfShell[20];
        auto *cell = new Cell(PhoneFabricator, PhoneName, PhoneColor, PhoneWeight,
                              PhoneNumberOfSIMCards, PhoneScreenDiagonal, PhoneTouchScreen,
                              PhoneTypeOfShell);
        delete cell;
    }
};
 
int main()
{
    Derived d; // Cell() [1]
    d.LoadList1(); // Cell() [2]
}
Вызывается конструктор с параметрами. В чем проблема?
0
2 / 2 / 1
Регистрация: 08.03.2019
Сообщений: 52
29.06.2019, 00:15  [ТС] 4
Цитата Сообщение от notAll Посмотреть сообщение
Вызывается конструктор с параметрами. В чем проблема?
Проблема в том,что записываются начальные значения,а не те,что что загружаются из файла.
То есть изначально параметры типа char у меня имеют значение "Unknown",а числовые - 0(NULL).Именно эти и записываются,хотя я указал при вызове конструктора другие значения.

Добавлено через 2 минуты
Цитата Сообщение от nalbe666 Посмотреть сообщение
Так он пустой.
Ну так всё,Что нужно в круглых скобках записано,их программа узнаёт при вызове конструктора с параметрами.А если ей они неизвестны(конструктор с параметрами не вызывается),то уже задаются начальные значения.Я хочу,Чтобы так это работало,и по моему мнению,так оно и должно быть. Я не могу понять,что не так
0
805 / 495 / 208
Регистрация: 19.01.2019
Сообщений: 1,194
29.06.2019, 00:40 5
Параметры функции - это просто данные, которые передаются в функцию при вызове. Так как вы вызываете определённую перегруженную функцию-конструктор (исходя из параметров) и тело функции пустое, то произойдёт ничего. Переменные класса не инициализируются новыми значениями.
Цитата Сообщение от Денис73 Посмотреть сообщение
изначально параметры типа char у меня имеют значение "Unknown",а числовые - 0(NULL)
Полагаю, эти значения получены при объявлении переменных в классе.
0
2 / 2 / 1
Регистрация: 08.03.2019
Сообщений: 52
29.06.2019, 00:53  [ТС] 6
Цитата Сообщение от nalbe666 Посмотреть сообщение
Полагаю, эти значения получены при объявлении переменных в классе.
Так и есть
Цитата Сообщение от nalbe666 Посмотреть сообщение
Параметры функции - это просто данные, которые передаются в функцию при вызове. Так как вы вызываете определённую перегруженную функцию-конструктор (исходя из параметров) и тело функции пустое, то произойдёт ничего. Переменные класса не инициализируются новыми значениями.
То есть можно сделать так: в параметрах конструктора указать переменные,а затем в теле конструктора присвоить их тем,что указаны в параметрам класса,я правильно понял?
C++
1
2
3
4
5
6
7
8
9
10
        Cell(char PhoneName1[30],char PhoneFabricator1[20],char PhoneColor1[20],float PhoneWeight1,int PhoneNumberOfSIMCards1,float PhoneScreenDiagonal1,char PhoneTouchScreen1[12],char PhoneTypeOfShell1[20])
        {
            strcpy(PhoneName,PhoneName1);
            strcpy(PhoneFabricator,PhoneFabricator1);
            strcpy(PhoneColor,PhoneColor1);
            PhoneNumberOfSIMCards = PhoneNumberOfSIMCards1;
            PhoneScreenDiagonal = PhoneScreenDiagonal1;
            strcpy(PhoneTouchScreen,PhoneTouchScreen1);
            strcpy(PhoneTypeOfShell,PhoneTypeOfShell1);
        }
Что-то типо этого? Здесь параметры без 1 в конце - это параметры класса,а те, что с 1 - конструктора.
0
805 / 495 / 208
Регистрация: 19.01.2019
Сообщений: 1,194
29.06.2019, 01:32 7
Угу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2019, 01:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Конструктор Шредингера "нет подходящего конструктора по умолчанию", хотя он есть
собственно, код. на 156-й строке ( cont(circi);) ругается на отсутствие конструктора в классе. но...

Visual жалуется на конструктор "Error C2512: нет подходящего конструктора по умолчанию"
Привет, мне Visual C++ выдал такие ошибки делаю все как в уроке, пытаюсь описать класс в...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор)
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор...


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

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

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