Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bambique
1 / 1 / 2
Регистрация: 02.04.2015
Сообщений: 169
#1

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

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

У меня есть в классе конструктор по умолчанию:
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)
{
 
}
Компилятор говорит, что так сделать нельзя так как такого констуктора нету, все правильно в принципе. Нельзя ли как-то обойтись без ещё одного конструктора? Я не вижу вариантов, но мало ли.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2016, 00:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача аргументов в конструктор (C++):

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

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

Как написать конструкторы копирования, инициализации и конструктор без аргументов? - C++
Как написать конструкторы копирования, инициализации и конструктор без аргументов? Вот код #include <iostream> using namespace...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
6533 / 2713 / 469
Регистрация: 15.11.2014
Сообщений: 5,992
Завершенные тесты: 1
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)
{
 
}
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3800 / 2058 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
04.04.2016, 07:31 #3
Цитата Сообщение от bambique Посмотреть сообщение
Компилятор говорит, что так сделать нельзя
Это какая-то мистика. Показывайте больше кода. В том, что вы привели, никаких проблем не видно.
Serg_o_Grey
66 / 66 / 24
Регистрация: 29.03.2016
Сообщений: 339
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 
{
 
}
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
04.04.2016, 08:34 #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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)
{
}
bambique
1 / 1 / 2
Регистрация: 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 в параметре конструктора наследника и базового класса - это одно и то же по смыслу, то конструктор наследника написать можно так:
Это первое, что пришло в голову, но я надеялся, что как-то можно передать два аргумента, которые не соответствуют порядку фактических параметров.
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
05.04.2016, 16:31 #7
Цитата Сообщение от bambique Посмотреть сообщение
но я надеялся, что как-то можно передать два аргумента, которые не соответствуют порядку фактических параметров.
Нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 16:31
Привет! Вот еще темы с ответами:

Передача аргументов в приложении - C++
Здравствуйте. Пишу оконное приложение, которое должно реализовывать функции snmpwalk утилиты: опрашивать WiFi контроллер, и получать с него...

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

Передача аргументов в функцию - C++
Что сработает быстрее? void Func(const A &amp;a = A(0, 0, 0)) { } или void Func(A a = A(0, 0, 0))

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.04.2016, 16:31
Ответ Создать тему
Опции темы

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