Поиск:

Ответ в темуСоздание новой темы Создание опроса
> #include работают непонятно как 
V
    Опции темы
mustang123_07
Дата 4.12.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.10.2007

Репутация: нет
Всего: нет



всем привет.

Что-то я совсем непонимаю как в VC6 работает #include ((

Создаю новый проект, добавляю в него различные файлы (cpp и h). В cpp у меня функции а в h их объявления. 

Если файл добавлен в список файлов проекта то #include говорит что файлы уже объявлены...

И странно если есть один файл cpp и к нему подключен второй файл cpp и оба этих файла используют какие-то константы из h файла, то когда этот h файл подключаешь к одному из cpp константы видны только в нем, а в другом говорит что они не объявлены... Причем если во втором cpp файле тоже сделать инклуд того же h файла то тут он опять выбает ошибку что файл уже подключен...

Кароче непонятно что весь день провозился только с тем чтобы заставить его видеть нормально файлы... так и не получилось
PM MAIL   Вверх
zkv
Дата 4.12.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



mustang123_07, здесь что-то подобное обсуждали, пользуйся поиском, периодически такие темы всплывают.
PM MAIL   Вверх
mustang123_07
Дата 7.12.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.10.2007

Репутация: нет
Всего: нет



Теперь не понятно что творится при работе с классами..

Для каждого класса у меня отдельный файл.  Вот один из них

Код

class Button {
    public:
        void SetPosition(int x, int y);
        void SetId(int id);
        void SetSize(int width, int height);
        void SetColor(int color);
        void SetCaption(char * caption);
        void Draw(void);
    private:
        int X;
        int Y;
        int Width;
        int Height;
        int Id;
        int Color;
        char *Caption;
};


void Button::SetPosition(int x, int y){
    X = x;
    Y = y;
}

void Button::SetId(int id){
    Id = id;
}

void Button::SetSize(int width, int height){
    Width = width;
    Height = height;
}

void Button::SetColor(int color){
    Color = color;
}

void Button::SetCaption(char * caption){
    Caption = caption;
}

void Button::Draw(void){
      int _ebx = X*65536+Width;
      int _ecx = Y*65536+Height;
      int id = Id;
      int color = Color;
      _asm {
            mov  eax, 8;                     ; close button
            mov  ebx, _ebx;
            mov  ecx, _ecx;
            mov  edx, id;
            mov  esi, color;
            int  0x40;
      }

      if (Caption){
        char *temp = Caption;

        int len;// = strlen(temp);

        int Bx = len * 6;
        
        int TextX = (int)X/2 - (int)Bx/2;
        int TextY = (int)Y/2 - 4;

        int u = TextX*65536+TextY;

        
        _asm
        {
            MOV  EAX, 4
            MOV  EBX, u
            MOV  ECX, 0x0
            MOV  EDX, temp
            MOV  ESI, len
            INT  0x40;
        }
      }
}



В главном файле прописываю

#include "inc/classes/button.cpp"

и использую класс

Код

Button B1, B2;

        B1.SetId(23);
        B1.SetPosition(100,100);
        B1.SetSize(30,20);
        B1.SetColor(0x9D40D2);
        B1.SetCaption("Button1");
        B1.Draw();

        B2.SetId(23);
        B2.SetPosition(150,100);
        B2.SetSize(40,30);
        B2.SetColor(0xFF3029);
        B2.SetCaption("Button2");
        B2.Draw();



Мне вылетают ошибки

Цитата

--------------------Configuration: kolibri - Win32 Debug--------------------
Compiling...
main.cpp
Skipping... (no relevant changes detected)
funcs.cpp
Linking...
main.obj : error LNK2005: "public: void __thiscall Window::SetStyle(int)" (?SetStyle@Window@@QAEXH@Z) already defined in window.obj
main.obj : error LNK2005: "public: void __thiscall Window::SetColor(int)" (?SetColor@Window@@QAEXH@Z) already defined in window.obj
main.obj : error LNK2005: "public: void __thiscall Window::SetSize(int,int)" (?SetSize@Window@@QAEXHH@Z) already defined in window.obj
main.obj : error LNK2005: "public: void __thiscall Window::SetPosition(int,int)" (?SetPosition@Window@@QAEXHH@Z) already defined in window.obj
main.obj : error LNK2005: "public: void __thiscall Window::SetTitle(char *)" (?SetTitle@Window@@QAEXPAD@Z) already defined in window.obj
main.obj : error LNK2005: "public: void __thiscall Window::Draw(void)" (?Draw@Window@@QAEXXZ) already defined in window.obj
button.obj : error LNK2005: "public: void __thiscall Button::SetPosition(int,int)" (?SetPosition@Button@@QAEXHH@Z) already defined in main.obj
button.obj : error LNK2005: "public: void __thiscall Button::SetId(int)" (?SetId@Button@@QAEXH@Z) already defined in main.obj
button.obj : error LNK2005: "public: void __thiscall Button::SetSize(int,int)" (?SetSize@Button@@QAEXHH@Z) already defined in main.obj
button.obj : error LNK2005: "public: void __thiscall Button::SetColor(int)" (?SetColor@Button@@QAEXH@Z) already defined in main.obj
button.obj : error LNK2005: "public: void __thiscall Button::SetCaption(char *)" (?SetCaption@Button@@QAEXPAD@Z) already defined in main.obj
button.obj : error LNK2005: "public: void __thiscall Button::Draw(void)" (?Draw@Button@@QAEXXZ) already defined in main.obj
Debug/kolibri.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

kolibri.exe - 13 error(s), 0 warning(s)


Что делать, помогите пожалуйста
PM MAIL   Вверх
zkv
Дата 7.12.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(mustang123_07 @  7.12.2007,  19:09 Найти цитируемый пост)
#include "inc/classes/button.cpp"


mustang123_07, пока не разберешься лучше с единицами трансляции, прими за правило:  Никогда не инклудь .cpp-файлы, инклудятся только .h-файлы
PM MAIL   Вверх
mustang123_07
Дата 7.12.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.10.2007

Репутация: нет
Всего: нет



А какое содержание должно быть в h файле описывающим класс? Дайте пожалуйста ссылочку на пример.. или что-то чтоб я понял как создавать прототипы класса или что там... 
PM MAIL   Вверх
Greeen
Дата 7.12.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



Код

// foo.h

class Foo
{
public:
     void someFunction();
};

Код

// foo.cpp

void Foo::someFunction()
{
     // do something
}


Это сообщение отредактировал(а) Greeen - 7.12.2007, 19:35


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
zkv
Дата 7.12.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



я в первом посте ссылку давал.

еще пример:
Код

//button.h
#pragma once

class Button {
    public:
        void SetPosition(int x, int y);
        void SetId(int id);
        void SetSize(int width, int height);
        void SetColor(int color);
        void SetCaption(char * caption);
        void Draw(void);
    private:
        int X;
        int Y;
        int Width;
        int Height;
        int Id;
        int Color;
        char *Caption;
};

Код

//button.cpp
#include "button.h"
void Button::SetPosition(int x, int y){
    X = x;
    Y = y;
}
void Button::SetId(int id){
    Id = id;
}
void Button::SetSize(int width, int height){
    Width = width;
    Height = height;
}
void Button::SetColor(int color){
    Color = color;
}
void Button::SetCaption(char * caption){
    Caption = caption;
}
void Button::Draw(void){
      int _ebx = X*65536+Width;
      int _ecx = Y*65536+Height;
      int id = Id;
      int color = Color;
      _asm {
            mov  eax, 8;                     ; close button
            mov  ebx, _ebx;
            mov  ecx, _ecx;
            mov  edx, id;
            mov  esi, color;
            int  0x40;
      }
      if (Caption){
        char *temp = Caption;
        int len;// = strlen(temp);
        int Bx = len * 6;
        
        int TextX = (int)X/2 - (int)Bx/2;
        int TextY = (int)Y/2 - 4;
        int u = TextX*65536+TextY;
        
        _asm
        {
            MOV  EAX, 4
            MOV  EBX, u
            MOV  ECX, 0x0
            MOV  EDX, temp
            MOV  ESI, len
            INT  0x40;
        }
      }
}

Код

//main.cpp
#include "button.h"

//тут используем наш класс

PM MAIL   Вверх
mustang123_07
Дата 7.12.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.10.2007

Репутация: нет
Всего: нет



Спасибо, получилось  smile 
PM MAIL   Вверх
JackYF
Дата 7.12.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



mustang123_07, помечай тему решённой.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.