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

Вызов конструктора шаблонного класса

28.12.2013, 05:45. Показов 6651. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть шаблонный класс стек, он является полем в классе Express, но компилятор выдает ошибку
" Ошибка 1 error C2614: Express: недопустимая инициализация члена: 'Stack' не является базовым классом или членом"


C++
1
2
3
4
5
6
7
8
9
class Express
{
    Stack <char> s;
    char *str;
    int len;
public:
    Express();
    Express(const char *);
};
C++
1
2
3
4
5
6
7
8
9
Express::Express(): Stack(), str(0), len(0)//здесь ошибка 
{}
 
Express::Express(const char *ss): Stack()//и здесь
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
Объясните как правильно вызывать конструктор шаблонного класса стек в классе Express
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2013, 05:45
Ответы с готовыми решениями:

Неявный вызов конструктора шаблонного класса при операции сравнения
Реализовал шаблонный класс целых чисел, для использования его в шаблонном классе дробей. Звучит...

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

Различное поведение конструктора шаблонного класса в зависимости от типа параметра
Здравствуйте. Возникла проблема - при попытке изменить поведение конструктора шаблонного класса...

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a;...

11
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 05:59 2
Цитата Сообщение от viktorius Посмотреть сообщение
Объясните как правильно вызывать конструктор шаблонного класса стек в классе Express
И зачем его, в данном случае, вызывать? Конструктор по умолчанию и так вызовется.
0
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 106
28.12.2013, 06:11  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем его, в данном случае, вызывать? Конструктор по умолчанию и так вызовется.
чтоб создать объект шаблонного класса

если я убираю Stack()

C++
1
2
3
4
5
6
7
8
9
Express::Express(): str(0), len(0)
{}
 
Express::Express(const char *ss)
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
выдает ошибки Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack<char>::Stack<char>(void)" (??0?$Stack@D@@QAE@XZ) в функции "public: __thiscall Express::Express(void)" (??0Express@@QAE@XZ) express.obj
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 06:19 4
Цитата Сообщение от viktorius Посмотреть сообщение
чтоб создать объект шаблонного класса
Конструкторы не создают объекты, они инициализируют поля. Объект Stack <char> s будет создан при создании объекта Express и инициализированн (в данном случае) конструктором по умолчанию.

Добавлено через 2 минуты
Но если очень хочется явно инициализировать:
C++
1
2
3
4
5
6
7
8
9
Express::Express(): s(), str(0), len(0)
{}
 
Express::Express(const char *ss): s()
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
Добавлено через 1 минуту
Цитата Сообщение от viktorius Посмотреть сообщение
если я убираю Stack()
Покажите этот класс. Конструктор по умолчанию там есть?
0
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 106
28.12.2013, 06:25  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Конструкторы не создают объекты, они инициализируют поля.
да свои поля и

если полем класса является какой нибудь класс то нужно же создать объект этого класса (в классе) т.е. вызвать конструктор этого класса например при наследовании или композиции чтоб например передать ему параметры

но по сути ошибка в неправильном вызове конструктора шаблонного класса, прочитал тему шаблонов у Герберта Шилдта и Харви Дейтела Пол Дейтела, но там нет примеров похожих на мой случай

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
template <class T> class Stack
{
    T *st;
    int top, m;
public:
    Stack();
    ~Stack();
    void Push(T);
    T Pop();
    int Gettop();
};
 
template <class T> Stack<T>::Stack(): st(0), top(0), m(0)
{}
 
template <class T> Stack<T>::~Stack()
{
    delete [] st;
}
 
template <class T> void Stack<T>::Push(T ch)
{
    if(m && !(m - top))
    {
        T *t = st;
        st = new T[m += n];
        for(int i = 0; i <= top; i++)
            st[i] = t[i];
        delete [] t;
    }
    else if(!m)
    {
        m = n;
        st = new T[m];
    }
    st[top++] = ch;
}
 
template <class T> T Stack<T>::Pop()
{
    if(m && (m - top > n + n))
    {
        T *t = st;
        st = new T[m -= n];
        for(int i = 0; i <= top; i++)
            st[i] = t[i];
        delete [] t;
    }
    return st[top--];
}
 
template <class T> int Stack<T>::Gettop()
{
    return top;
}
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 06:27 6
Цитата Сообщение от viktorius Посмотреть сообщение
если полем класса является какой нибудь класс то нужно же создать объект этого класса (в классе) т.е. вызвать конструктор этого класса например при наследовании или композиции чтоб например передать ему параметры
Ещё раз:
Цитата Сообщение от alsav22 Посмотреть сообщение
Конструкторы не создают объекты, они инициализируют поля. Объект Stack <char> s будет создан при создании объекта Express
Для создания объекта (выделения под него памяти) конструктор не нужен.
0
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 106
28.12.2013, 06:31  [ТС] 7
выложил класс стек

C++
1
2
3
4
5
6
7
8
9
Express::Express(): s(), str(0), len(0)
{}
 
Express::Express(const char *ss): s()
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
так выдает ошибку Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stackt<char>::Stackt<char>(void)" (??0?$Stackt@D@@QAE@XZ) в функции "public: __thiscall Express::Express(void)" (??0Express@@QAE@XZ) express.obj
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 06:33 8
Вот этот код у меня ошибок не выдаёт:
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
73
74
75
76
77
78
79
80
81
template <class T> class Stack
{
    T *st;
    int top, m;
public:
    Stack();
    ~Stack();
    void Push(T);
    T Pop();
    int Gettop();
};
 
template <class T> Stack<T>::Stack(): st(0), top(0), m(0)
{}
 
template <class T> Stack<T>::~Stack()
{
    delete [] st;
}
 
template <class T> void Stack<T>::Push(T ch)
{
    if(m && !(m - top))
    {
        T *t = st;
        st = new T[m += n];
        for(int i = 0; i <= top; i++)
            st[i] = t[i];
        delete [] t;
    }
    else if(!m)
    {
        m = n;
        st = new T[m];
    }
    st[top++] = ch;
}
 
template <class T> T Stack<T>::Pop()
{
    if(m && (m - top > n + n))
    {
        T *t = st;
        st = new T[m -= n];
        for(int i = 0; i <= top; i++)
            st[i] = t[i];
        delete [] t;
    }
    return st[top--];
}
 
template <class T> int Stack<T>::Gettop()
{
    return top;
}
 
 
class Express
{
    Stack <char> s;
    char *str;
    int len;
public:
    Express();
    Express(const char *);
};
 
Express::Express(): str(0), len(0)
{}
 
Express::Express(const char *ss)
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
 
int main()
{
    Express exp;
}
У вас шаблон и реализация в одном файле находятся? Должны быть в одном. У вас, скорее всего, ошибка именно поэтому. Компоновщик не находит реализацию конструктора по умолчанию.
0
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 106
28.12.2013, 06:37  [ТС] 9
нет все раздельно в 5 файлах
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 06:41 10
Цитата Сообщение от viktorius Посмотреть сообщение
нет все раздельно в 5 файлах
Из-за этого и ошибка. На будущее (касается только шаблонов): объявление и реализация должны быть в одном файле.

Добавлено через 2 минуты
Про работу конструктора можете здесь почитать: https://www.cyberforum.ru/blogs/18334/blog103.html
1
2 / 2 / 3
Регистрация: 24.02.2013
Сообщений: 106
28.12.2013, 06:45  [ТС] 11
и еще я только учусь, в книгах пишут что поля вложенного или базового класса должны быть инициализированы через конструктор, но это было без шаблонов

например

конструктор Manager вызывает конструктор Employee
C++
1
2
3
4
Manager::Manager(): Employee(), sub(0)
{
    cout<<"Manager new"<<endl;
}
получается с шаблонами это не нужно делать?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 06:55 12
Цитата Сообщение от viktorius Посмотреть сообщение
получается с шаблонами это не нужно делать?
Шаблоны тут не при чём.
Цитата Сообщение от viktorius Посмотреть сообщение
конструктор Manager вызывает конструктор Employee
И Manager производный от Employee. Так? У вас в коде разве есть наследование? Это во-первых. Во-вторых, если написапть так:
C++
1
2
3
4
Manager::Manager(): sub(0)
{
    cout<<"Manager new"<<endl;
}
, то будет то же самое, только конструктор по умолчанию вызывается не явно. Если нужно инициализировать конструктором не по умолчанию, то его уже нужно явно вызывать.

Добавлено через 3 минуты
Как в вашем коде вызвать явно конструктор по умолчанию, я показал в 4 посте:
C++
1
2
3
4
5
6
7
8
9
Express::Express(): s(), str(0), len(0)
{}
 
Express::Express(const char *ss): s()
{
    len = strlen(ss);
    str = new char[len + 1];
    strcpy(str, ss);
}
Добавлено через 1 минуту
Ссылку, про работу конструкторов, я вам выложил. Читайте.
1
28.12.2013, 06:55
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.12.2013, 06:55
Помогаю со студенческими работами здесь

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); }...

Вызов конструктора класса
есть класс Set, и в нем есть конструктор, как с этого конструктора мне массивы перенести в метод...

Повторный вызов конструктора класса
class X { public: X() {a = 10;}; setA(int value) {a = value;}; private: ...

Вызов конструктора родительского класса
Здравствуйте, столкнулся с такой проблемой: при вызове конструктора класса потомка (Derv1) через...

Вызов конструктора базового класса
Приветствую всех. Создаю класс-наследник std::string. У базового класса есть конструктор копии:...

Вызов конструктора базового класса
Здравствуйте! Я вот начал изучать C# и немножечко освежил ООП. Но вот у меня вопрос. Я точно помню,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru