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

Сборка проекта, объявление и инициализация конструкторов в одном месте - C++

Восстановить пароль Регистрация
 
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
25.03.2012, 08:01     Сборка проекта, объявление и инициализация конструкторов в одном месте #1
Всем привет!
Столкнулся с такой проблемой как "много файловая" программа. А именно если конструктор и диструктор описывать например в A.h а инициализировать в A.cpp то компоновщик начинает такт орать что оглохнуть можно!!! Пишет всякую ересь по делу не не по делу. Но в основном что мол например конструктор hello(void) и диструктор ~hello(void) объявлены но не описаны! С этим можно что то сделать?! Это ужасно не удобно, т.к. они у меня достаточно что делают и следят за объектами класса.
Я использую версию показанную на скриншоте:
Миниатюры
Сборка проекта, объявление и инициализация конструкторов в одном месте  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.03.2012, 08:16     Сборка проекта, объявление и инициализация конструкторов в одном месте #2
Цитата Сообщение от stawerfar Посмотреть сообщение
А именно если конструктор и диструктор описывать например в A.h а инициализировать в A.cpp то компоновщик начинает такт орать что оглохнуть можно!
Что значит инициализировать? И покажите лучше проблемный код, а не эмоции.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
25.03.2012, 08:51  [ТС]     Сборка проекта, объявление и инициализация конструкторов в одном месте #3
text.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "text.h"
 
//------------------------------------------------------------------------------------------------------------------
//инициализация статических полей
std::fstream text::sfile;
std::string text::staticline;
std::string text::statickey;
std::string text::staticresultline;
 
text::text(void)
{}
 
//виртуальный диструктор
 text::~text(void)
{}
 
//------------------------------------------------------------------------------------------------------------------
//конструктор с 2-мя параметрами
text::text(const char*const cchcaddress,const char*const cchckey)
{
    text::updata(cchcaddress,cchckey);//вызов метода для инициализации полей
}
 
//------------------------------------------------------------------------------------------------------------------
//инициализация полей
void text:: updata(const char*const cchcaddress,const char*const cchckey)
{
    sfile.open(cchcaddress,std::ios::in);
    //если не удалось отркрыть поток
    if(!sfile)
    {
        //смена кодировки для вывода Русского языка в консоли
        setlocale(LC_ALL,"Russian_Russia.1251");
        //если badbit или faibit
        if(sfile.bad())
        {
            std::cerr<<"Невозможно открыть файл!";
            std::cerr<<"Неисправимая ошибка!\n";
            system("pause");//даём возможность взглянуть на сообщение
            setlocale(LC_ALL,"Russian_Russia.866");//возврат к стандартной кодировке
            exit(-1);
        }
        else if(sfile.fail())
        {
            std::cerr<<"Невозможно открыть файл!\n";
            std::cerr<<"Файл либо не существует либо не правильно указан путь к файлу!\n";
            system("pause");//пауза
            setlocale(LC_ALL,"Russian_Russia.866");//возврат к стандартной кодировке
            exit(-1);
        }
 
    }
    sfile.close();//закрываем поток для перезадачи атрибутов открытия
    sfile.open(cchcaddress,std::ios::in|std::ios::binary);
    char ch;//для временного хранения символов
    sfile.get(ch);//задаем первое значение символа
    while(sfile)//продолжать пока не дойдём до конца файла
    {
        staticline+=ch;//добовляем посимвольно значения из файла в поле 
        sfile.get(ch);
    }
    //запись текста из файла в поле класса
    statickey=cchckey;//копирование ключа
    sfile.close();//закрываем паток
}
 
//------------------------------------------------------------------------------------------------------------------
//статический метод для записи на диск
int text::write(const char* const cchcaddress)
{
    sfile.open(cchcaddress,std::ios::out|std::ios::binary);//открыть паток
    if(!sfile)//если поток не открыт ничего не предпринемаем
    {   
        setlocale(LC_ALL,"Russian_Russia.1251");
        std::cerr<<"Провал записи!Закрыт поток\n";
        setlocale(LC_ALL,"Russian_Russia.866");
        return 1;
    }
    sfile<<staticresultline<<std::endl;//запись в файл
    sfile.close();//закрыть паток
    return 0;
}
 
//------------------------------------------------------------------------------------------------------------------
//статический метод для чтения с диска
int text::read(const char*const cchcaddress)
{
    sfile.open(cchcaddress,std::ios::in|std::ios::binary);//открыть паток
    if(!sfile)//если поток не открыт то ничего не предпринемаем
    {   
        setlocale(LC_ALL,"Russian_Russia.1251");
        std::cerr<<"Провал записи!Закрыт поток\n";
        setlocale(LC_ALL,"Russian_Russia.866");
        return 1;
    }
    char ch;//для временного хранения символов
    sfile.get(ch);//задаем первое значение символа
    while(sfile)//продолжать пока не дойдём до конца файла
    {
        staticline+=ch;//добовляем посимвольно значения из файла в поле 
        sfile.get(ch);
    }
    sfile.close();//закрыть паток
    return 0;
}
//------------------------------------------------------------------------------------------------------------------
//фиктивная зашифровать разшифровать
int text:: unstencry(void)
{return 1;}
 
void text:: show(void)
{std::cout<<staticline<<statickey<<staticresultline<<std::endl;}
text.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
//объявления
#include<fstream>
#include<iostream>
#include<string>
#include<typeinfo>
//базовый класс текст
class text
{
    //protected:
    public:
        static std::fstream sfile;//указатель на поток
        static std::string staticline;//исходный текст
        static std::string statickey;//ключ
        static std::string staticresultline;//зашифрованый текст
        //конструктрор без параметров
        text(void);
        //конструктор с 2-мя параметрами
        text(const char*const,const char*const);
        //виртуальный диструктор
        virtual ~text(void);
        //статический метод инициализация полей
        static void updata(const char*const,const char*const);
        //запись на диск
        static int write(const char*const);
        //чтение с диска
        static int read(const char* const);
        //фиктивная зашифровать раcшифровать
        virtual int unstencry(void);
        void show(void);
 
};
vigener.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
#include "text.h"
class vigener :virtual private text
{
    private:
        static const int sciMAXASCII866;//количество символов в таблице ASCII866 
        static unsigned int suicount;//счетчик на объекты класса
        static std::string sstrACII866;//таблица ASCII866
        static char** chptgemline;//для хранения альтернативной записи текста в числах
        static unsigned int suisizegemline;//для хранения размерности матрицы chptgemline
        //перегрузка оператора копирования
        vigener(const vigener& const);
        //перегрузка оператора присвоения
        vigener& operator=(const vigener& const);
    public:
        //конструктор без параметров
        vigener(void);
        //конструктор с двумя параметрами
        vigener(const char*const,const char*const);
        //диструктор
        ~vigener(void);
        //сгенерировать таблицу ASCII866 в числовом диапозоне 1..255
        static void getASCII866(void);
        //зашифровать раcшифровать
        int unstencry(void);
        //преобразовать исходный текст в альтернативный числовой в соответствии с ASCII866
        void numtrans(void);
        //преобразовать числовой вид в текст
        void literaltrans(void);
};
vigener.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
#include "vigener.h"
//инициализация статических полей класса
unsigned int vigener::suicount;
const int vigener::sciMAXASCII866 = 255;
 
/*
 
        static const int sciMAXASCII866;//количество символов в таблице ASCII866 
        static unsigned int suicount;//счетчик на объекты класса
        static std::string sstrACII866;//таблица ASCII866
        static char** chptgemline;//для хранения альтернативной записи текста в числах
        static unsigned int suisizegemline;//для хранения размерности матрицы chptgemline
        //перегрузка оператора копирования
        vigener(const vigener& const);
        //перегрузка оператора присвоения
        vigener& operator=(const vigener& const);
*/
vigener::vigener(void):text()
{suicount++;}
 
vigener::~vigener(void)
        {   if(suicount<1)
            {
                for(int i=0;i<suisizegemline;i++)
                    delete chptgemline[i];
            }
            else
            {suicount--;}
        }
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include"text.h"
 
int main(void)
{
    class text t("text.doc","key");
 
    system("pause");
 
return 0;
}
Добавлено через 11 минут
Что бы этот код не отгонял людей сразу скажу что из всего этого нужно отследить работу конструктора и диструктора. Т.е. когда они объявлены и описаны в *.h то собирается без ошибок, иначе
C++
1
2
3
4
Ошибка  7   error LNK1120: 3 неразрешенных внешних элементов    D:\Project_VS_2010\C++\garbage\encryption\Debug\encryption.exe  encryption
Ошибка  4   error LNK2001: неразрешенный внешний символ ""private: static char * * vigener::chptgemline" (?chptgemline@vigener@@0PAPADA)"   D:\Project_VS_2010\C++\garbage\encryption\encryption\vigener.obj    encryption
Ошибка  5   error LNK2001: неразрешенный внешний символ ""private: static unsigned int vigener::suisizegemline" (?suisizegemline@vigener@@0IA)" D:\Project_VS_2010\C++\garbage\encryption\encryption\vigener.obj    encryption
Ошибка  6   error LNK2019: ссылка на неразрешенный внешний символ "public: virtual int __thiscall vigener::unstencry(void)" (?unstencry@vigener@@UAEHXZ) в функции "[thunk]:public: virtual int __thiscall vigener::unstencry`vtordisp{4294967292,0}' (void)" (?unstencry@vigener@@$4PPPPPPPM@A@AEHXZ)  D:\Project_VS_2010\C++\garbage\encryption\encryption\vigener.obj    encryption
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
25.03.2012, 10:16     Сборка проекта, объявление и инициализация конструкторов в одном месте #4
пишет ошибки по делу.
не определены статические константы(у вас они закомментированы в vigener.cpp) и ф-ия vigener::unstencry(void)
Yandex
Объявления
25.03.2012, 10:16     Сборка проекта, объявление и инициализация конструкторов в одном месте
Ответ Создать тему
Опции темы

Текущее время: 07:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru