Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
1

Передача аргументов в конструктор

04.04.2016, 00:26. Показов 4375. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть в классе конструктор по умолчанию:
C++
1
Port(const char * br = "none",const char * st = "none",int b = 0);
Я создал производный от этого класс в котором также используется динамическое выделение памяти и в конструкторе производного класса я хочу вызвать конструктор базового класса, но только с двумя аргументами например:
C++
1
2
3
4
VintagePort::VintagePort(const char *br, int b, const char *nn, int y): Port(br,b)
{
 
}
Компилятор говорит, что так сделать нельзя так как такого констуктора нету, все правильно в принципе. Нельзя ли как-то обойтись без ещё одного конструктора? Я не вижу вариантов, но мало ли.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2016, 00:26
Ответы с готовыми решениями:

Пустой конструктор без аргументов
Всем доброго времени суток. Я сейчас в процессе изучения С++, читаю книгу Лафоре...

Почему нельзя вызывать конструктор без аргументов?
В чем может быть ошибка? На Visual Studio все работает #include <iostream> #include <cstring>...

Как принять заранее неизвестное количество аргументов и передать их в конструктор?
Допустим есть функция которая создает объект template<typename T> T* createObject(typename...

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

6
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.04.2016, 00:33 2
C++
1
Port(const char * br = "none",const char * st = "none",int b = 0, int y = 0);

C++
1
2
3
4
VintagePort::VintagePort(const char *br, const char *nn, int b, int y): Port(br,b)
{
 
}
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
04.04.2016, 07:31 3
Цитата Сообщение от bambique Посмотреть сообщение
Компилятор говорит, что так сделать нельзя
Это какая-то мистика. Показывайте больше кода. В том, что вы привели, никаких проблем не видно.
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
04.04.2016, 07:44 4
а почему наслуедется Port(br,b) а не Port(br, st, b)?

Добавлено через 2 минуты
и разве наследование не так производится?:
C++
1
2
3
4
VintagePort::VintagePort(const char *br, const char *nn, int b, int y): Port 
{
 
}
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
04.04.2016, 08:34 5
Лучший ответ Сообщение было отмечено bambique как решение

Решение

Цитата Сообщение от bambique Посмотреть сообщение
У меня есть в классе конструктор
Насколько я вижу, проблема тут в том, что второй аргумент конструктора Port - const char *, в то время как из наследника туда передается int. Следовательно, если принять, что b в параметре конструктора наследника и базового класса - это одно и то же по смыслу, то конструктор наследника написать можно так:
C++
1
2
3
VintagePort(const char *br, int b, const char *nn, int y): Port(br, "none", b)
{
}
1
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
05.04.2016, 16:11  [ТС] 6
Цитата Сообщение от hoggy Посмотреть сообщение
Port(const char * br = "none",const char * st = "none",int b = 0, int y = 0);
Мне не нужен аргумент y в конструкторе базового класса, но все же почему это должно заработать? Чем этот четвертый параметр мне поможет? Даже если оно и заработает, то почему?

Добавлено через 7 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В том, что вы привели, никаких проблем не видно.
Как это не видно? Я описал вам проблему, вот весь код.
.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
30
31
32
33
34
35
36
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
class Port
{
private:
    char * brand;
    char style[20];
    int bottles;
public:
    Port(const char * br = "none",const char * st = "none",int b = 0);
    Port(const Port &p);
    virtual ~Port() { delete[] brand; };
    Port & operator=(const Port &p);
    Port & operator+=(int b);
    Port &operator-=(int b);
    int BottleCount() const { return bottles; };
    virtual void Show() const;
    friend std::ostream & operator<<(std::ostream &os, const Port & p);
};
 
 
class VintagePort :public Port
{
private:
    char * nickname;
    int year;
public:
    //VintagePort();
    VintagePort(const char *br, int b, const char *nn, int y);
    //VintagePort(const VintagePort &vp);
    ~VintagePort() { delete[] nickname; };
    //VintagePort & operator=(const VintagePort &vp);
    //void Show() const;
    //friend ostream & operator<<(ostream &os, const VintagePort &vp);
};
.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
#include "Port.h"
 
using namespace std;
 
 
 
Port::Port(const char * br, const char * st, int b)
{
    brand = new char[strlen(br) + 1];
    strcpy(brand, br);
    strcpy(style, st);
    bottles = b;
}
 
Port::Port(const Port &p)
{
    brand = new char[strlen(p.brand) + 1];
    strcpy(brand, p.brand);
    strcpy(style, p.style);
    bottles = p.bottles;
}
 
Port & Port::operator=(const Port &p)
{
    if (this == &p)
        return *this;
    delete brand;
    brand = new char[strlen(p.brand) + 1];
    strcpy(brand, p.brand);
    strcpy(style, p.style);
    bottles = p.bottles;
    return *this;
}
 
Port & Port::operator+=(int b)
{
    bottles += b;
    return *this;
}
 
Port & Port::operator-=(int b)
{
    bottles -= b;
    return *this;
}
 
void Port::Show() const
{
    cout << "Brand: " << brand << endl;
    cout << "Kind: " << style << endl;
    cout << "Bottles: " << bottles << endl;
}
 
std::ostream & operator<<(std::ostream &os, const Port & p)
{
    os << p.brand << ", " << p.style << ", " << p.bottles << endl;
    return os;
}
 
 
VintagePort::VintagePort(const char *br, int b, const char *nn, int y): Port(br,b)
{
    year = y;
    strcpy(nickname, nn);
 
}
Source.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Port.h"
#include <iostream>
 
using namespace std;
 
int main()
{
 
 
    Port a("Visky", "old", 56);
    a.Show();
    VintagePort c("dsad",5,"dsada",45);
    c.Show();
    cin.get();
    return 0;
}
Ошибки компилятора:
"Port::Port(const Port &)": невозможно преобразовать аргумент 2 из "int" в "const char *"

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Насколько я вижу, проблема тут в том, что второй аргумент конструктора Port - const char *, в то время как из наследника туда передается int. Следовательно, если принять, что b в параметре конструктора наследника и базового класса - это одно и то же по смыслу, то конструктор наследника написать можно так:
Это первое, что пришло в голову, но я надеялся, что как-то можно передать два аргумента, которые не соответствуют порядку фактических параметров.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
05.04.2016, 16:31 7
Цитата Сообщение от bambique Посмотреть сообщение
но я надеялся, что как-то можно передать два аргумента, которые не соответствуют порядку фактических параметров.
Нельзя.
1
05.04.2016, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2016, 16:31
Помогаю со студенческими работами здесь

Передача аргументов в ф-ию
void test(const T&amp; a) {} Это понятно, а что это за запись: void test(T const&amp; a) {} И...

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

Передача аргументов в функцию
Прошу помощи в разборе багов кода. Ошибка при компиляции связана с неверной передачей аргументов...

Передача аргументов в функцию
Хочу размерность массива задать в отдельной функции, но не получается разобраться с передачей...

Передача аргументов функции
Всем привет. Писал код не зная, правильно ли это. В общем застрял на составлении прототипов функции...

Передача аргументов в функцию
как передать аргумент в функцию по указателю? нашел только по значению: int sqr(int x); int...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru