Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Проблемма с конструктором


Автор: Ak47black 3.10.2009, 16:13
Здравствуйте.
Народ помогите пожалуйста, застрял на следующем коде
main.cpp
Код

#include "mystack.h"

int main()
{
        DVDStack stack();
        return 0;
}
//---------------------------------------------------------------------------


mystack.cpp
Код

#include<iostream>
#include "mystack.h"
#include "dvd.h"

using namespace std;

void DVDStack::push(DVD val)
{
    v[ top ] = val; 
    top++;    
}

DVD DVDStack::pop()
{
    top--;
    return (v[top]);
}

DVDStack::DVDStack(int i) // Тут у меня вылетает ошибка
{
    top = 0;
}

int DVDStack::full()
{
    return (top >= SIZE);
}

void DVDStack::MyStackPrint()
{
    int i;
    if (top == 0)
       cout << "Stack is empty." << endl;
    else
    {
       cout << "Stack contents: ";
       for (i=0; i<top; i++)
       {
          v[i].print(); 
       }
       cout << endl;
    }
}

mystack.h
Код

/* mystack.h -- Stack declaration and function prototypes:  */
#define SIZE 20
#include "dvd.h"

class DVDStack
{
    DVD v[SIZE];
    int top;
    void push(DVD val);
    DVD pop();
    DVDStack(int i);
    int full();
    void MyStackPrint();
};



Получаю ошибку
Цитата

[C++ Error] mystack.cpp(20): E2279 Cannot find default constructor to initialize member 'DVDStack::v'

в месте
Код

DVDStack::DVDStack(int i)
{

Вродебы всё правильно описал, но всеровно вижу ошибку.

Автор: ISergeyN 3.10.2009, 16:29
Код

class DVDStack
{
public: //! Забыл
    DVD v[SIZE];

Автор: zim22 3.10.2009, 16:53
Ak47black, добавь defalult constructor в класс DVD
Код

...
DVD(string pavadinimas_, string informacija_, int numeris_);
DVD() : numeris(0) {}
...

***
Код

int main()
{
        DVDStack stack(); // !!! это прототип функции, ничего не принимающей и возвращающей DVDStack
        return 0;
}

Автор: Ak47black 3.10.2009, 19:40
Код

DVD() : numeris(0) {}

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

DVDStack::DVDStack()
{
    top = 0;
    cout << "Test.";
}

Тоесть вродебы вот этот код
Код

DVDStack stack();

Должен по идее создавать класс при этом вызывая конструктор.
Почему так происходит?  smile 

Автор: zim22 3.10.2009, 20:08
Цитата(Ak47black @  3.10.2009,  19:40 Найти цитируемый пост)
Почему так происходит? 

Цитата(zim22 @  3.10.2009,  16:53 Найти цитируемый пост)
 DVDStack stack(); // !!! это прототип функции, ничего не принимающей и возвращающей DVDStack

Ak47black, объект создаётся так:
Код

DVDStack stack;

Автор: Ak47black 3.10.2009, 20:30
Фффф теперь у меня ошибка
(С этим кодом)
Код

DVDStack stack;

Цитата

[Linker Error] Unresolved external 'DVD::~DVD()' referenced from D:\...\MAIN.OBJ

А что ему от деструктора надо?  
Главное что когда я его отдельно использовал, он у меня неругался. smile 

Автор: zim22 3.10.2009, 20:33
файл dvd.h
замени                 ~DVD ();
на ~DVD () {}

Автор: Ak47black 3.10.2009, 20:39
Но теперь будет вызыватся всегда пустая функция.
А как сделать чтобы  вызывалась
Код

DVD::~DVD()

(Тоесть не из {})

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

Автор: mes 3.10.2009, 20:45
Цитата(Ak47black @  3.10.2009,  19:39 Найти цитируемый пост)
Но теперь будет вызыватся всегда пустая функция.
А как сделать чтобы  вызывалась

Чтоб вызывался не-пустой деструктор, напишите любое требуемое тело деструктора внутри скобок smile


Цитата(Ak47black @  3.10.2009,  19:39 Найти цитируемый пост)
И если можно то объясните пожалуйста хоть немного почему при использовании классов в классе получаются такие проблемма. 


Цитата(Ak47black @  3.10.2009,  19:30 Найти цитируемый пост)
Unresolved external 'DVD::~DVD()'

эта ошибка говорит, о том, что  дестуктор объявлен и имеется его вызов, а вызвать нечего, т.е. тело функции не найдено smile

Автор: Ak47black 3.10.2009, 20:57
У меня тут следующая проблема всплыла
Есля делаю dvd класс таким
Код

typedef class DVD
{
        private:
                string pavadinimas;
                string informacija;
        public:
                int numeris;
                DVD(string pavadinimas_, string informacija_, int numeris_);
                DVD():numeris(0) {}
                ~DVD(){};
                void print();
} dvd;

И например делаю так
Код

int main()
{
        DVDStack stack;
        for (int i = 0; i++; i<=3)
        {
                DVD *pi = new DVD("n1", "n2", i);
                
        }
        DVD dvd;
        return 0;
}

то получаю
Цитата

[Linker Error] Unresolved external 'DVD::DVD(_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, int)' referenced from D:\...\MAIN.OBJ

Автор: mes 3.10.2009, 21:08
Цитата(Ak47black @  3.10.2009,  19:57 Найти цитируемый пост)
У меня тут следующая проблема всплыла

если внимательно прочитаете предыдущий пост, то поймете, что ошибка возникает в следствии того, что некая функция не имеет тела, т.е. не определена.
ну а внимательно прочитав сообщение компилятора об ошибке, поймете какая именно функция проблемная. 
 smile  smile 

Автор: zim22 3.10.2009, 21:10
Цитата(Ak47black @  3.10.2009,  20:57 Найти цитируемый пост)
   for (int i = 0; i++; i<=3)

жесть
Код

for (int i = 0; i <= 3; ++i)

***
Код

#include "dvd.h"
int main()
{
...

Автор: Ak47black 3.10.2009, 21:16
Цитата

ошибка возникает в следствии того, что некая функция не имеет тела

Функция 
Код

DVD(string pavadinimas_, string informacija_, int numeris_);

определенна в файле dvd.cpp
Поэтому немогу понять.

Код

for (int i = 0; i <= 3; ++i)

Мда тут перегрелся уже smile

Добавлено через 1 минуту и 42 секунды
Код

#include "dvd.h"
int main()
{
...

У меня этот загововок написан.

Автор: zim22 3.10.2009, 21:22
линкуется

Автор: mes 3.10.2009, 21:25
Цитата(Ak47black @  3.10.2009,  20:16 Найти цитируемый пост)
определенна в файле dvd.cpp
Поэтому немогу понять.

ну или файл не подключен к проекту, (т.е. невключен в список компиляции), либо сигнатура не совпадает..
если последнее, то покажите определение этой функции.


Автор: Ak47black 3.10.2009, 21:26
С C++ Builder 6 невыходит.

Автор: Ak47black 3.10.2009, 21:43
Цитата

ну или файл не подключен к проекту, (т.е. невключен в список компиляции), либо сигнатура не совпадает..
если последнее, то покажите определение этой функции.

Да в этом проблема!
Сейчас пробую решить.

Автор: Ak47black 3.10.2009, 22:06
Ура, решал.
Тут эти почти все непонятные вещи были изза того что файлы mystack.cpp mystack.h были с непонятными пробелами.
Спасибо всем за участие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)