powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется тестовый проект
9 сообщений из 9, страница 1 из 1
Не компилируется тестовый проект
    #38100722
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Изучаю C++.

В MS Visual Studio 2012 создал пустой C++ проект. В группу "Source Files" добавил два файла:
Файл Book.cpp :
Код: plaintext
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.
#include<cstring>
namespace ab{
    class Book{
        static int booksCount;
        char name[50];
        char author[50];
    public:
        Book(char *name, char *author);
        ~Book();
        char *GetName(){return name;}
        void SetName(const char *name){if (!*name) strcpy(this->name, name);}
        char *GetAuthor(){return author;}
        void SetAuthor(const char *author){if (!*author) strcpy(this->author, author);}
        static int GetBooksCount();
    };
    int Book::booksCount;
    int Book::GetBooksCount(){ return Book::booksCount;}
    Book::Book(char *name, char *author){
        SetName(name);
        SetAuthor(author);
        ++Book::booksCount;
    }
    Book::~Book(){
        --Book::booksCount;
    }
}



Файл main.cpp :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include<iostream>
#include"Book.cpp"
int main(){
    ab::Book book("Ivan", "Ivanov");
    ab::Book book2("Oleg", "Olegovich");
    ab::Book *p = new ab::Book("Sergey", "Sergeevich");
    std::cout << "Books count: " << ab::Book::GetBooksCount() << std::endl;
    delete p;
    std::cout << "Books count: " << ab::Book::GetBooksCount() << std::endl;
    return 0;
}


Однако скомпилировать код не удаётся:
Текст ошибокError 5 error LNK2005: "public: __thiscall ab::Book::Book(char *,char *)" (??0Book@ab@@QAE@PAD0@Z) already defined in Book.obj C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 6 error LNK2005: "public: __thiscall ab::Book::~Book(void)" (??1Book@ab@@QAE@XZ) already defined in Book.obj C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 7 error LNK2005: "public: static int __cdecl ab::Book::GetBooksCount(void)" (?GetBooksCount@Book@ab@@SAHXZ) already defined in Book.obj C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 8 error LNK2005: "private: static int ab::Book::booksCount" (?booksCount@Book@ab@@0HA) already defined in Book.obj C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 9 error LNK1169: one or more multiply defined symbols found C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\Debug\CppClasses.exe CppClasses
Если я класс Book перепишу, сделав все функции подставляемыми (inline), то количество ошибок значительно уменьшается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include<cstring>
namespace ab{
    class Book{
        static int booksCount;
        char name[50];
        char author[50];
    public:
        Book(char *name, char *author){
            SetName(name);
            SetAuthor(author);
            ++Book::booksCount;
        }
        ~Book(){
            --Book::booksCount;
        }
        char *GetName(){return name;}
        void SetName(const char *name){if (!*name) strcpy(this->name, name);}
        char *GetAuthor(){return author;}
        void SetAuthor(const char *author){if (!*author) strcpy(this->author, author);}
        static int GetBooksCount(){ return Book::booksCount;}
    };
    int Book::booksCount;
}


Текст ошибокError 5 error LNK2005: "private: static int ab::Book::booksCount" (?booksCount@Book@ab@@0HA) already defined in Book.obj C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 6 error LNK1169: one or more multiply defined symbols found C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\Debug\CppClasses.exe 1 1 CppClasses
Но Book::booksCount - это статическая переменная... Хочешь-не хочешь, а определять её вне класса придётся. Если я закомментирую определение, то вылезают др. ошибки:
Текст ошибокError 5 error LNK2001: unresolved external symbol "private: static int ab::Book::booksCount" (?booksCount@Book@ab@@0HA) C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\main.obj CppClasses
Error 6 error LNK1120: 1 unresolved externals C:\Users\bushm_000\Documents\Visual Studio 2012\Projects\@Projects\Current Projects\CppClasses\Debug\CppClasses.exe 1 1 CppClasses
В чём проблема? Почему мне приходится переписывать функции как inline? Как этого избежать, если мне это не надо? И почему так и остаётся проблема со статическим полем?
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100725
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum#include"Book.cpp"
Где тебя научили так делать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100729
Переименуй Book.cpp в Book.h
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100738
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovCompositum#include"Book.cpp"
Где тебя научили так делать?

В каком-то примере видел и взял на заметку.
ПереименуйПереименуй Book.cpp в Book.h
Я это сделал первым же делом, но не помогло, потому вернул обратно на cpp.

Ок, я переименовал расширение на h и подправил include, но это не решило проблем.
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100743
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это поможет - выкладываю упакованный архив с "проектом" здесь .
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100745
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumОк, я переименовал расширение на h и подправил include, но это не решило
проблем.
Потому что ты не удалил вторую копию этого файла из проекта. Прочитай внимательно тексты
ошибок. Они запутаны, но однозначны. И в них точно названы имена файлов где расположены
дублирующиеся процедуры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100748
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovCompositumОк, я переименовал расширение на h и подправил include, но это не решило
проблем.
Потому что ты не удалил вторую копию этого файла из проекта. Прочитай внимательно тексты
ошибок. Они запутаны, но однозначны. И в них точно названы имена файлов где расположены
дублирующиеся процедуры.

Вторую копию чего? Вот содержимое каталога проекта:

...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100754
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumВторую копию чего?
Файла book.h. У тебя их два: один включается в main.cpp, второй компилируется сам по себе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не компилируется тестовый проект
    #38100760
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovФайла book.h. У тебя их два: один включается в main.cpp, второй компилируется сам по себе.

Понял, спасибо... Я думал, что смены расширения с cpp на h и перетаскивание мышкой файла в группу Header Files будет достаточно - оказалось что нет...

Сейчас сделал следующее: для файла Book.h свойству Included In Project поставил значение False - файл сразу исчез из проекта. Затем из контекстного меню добавил этот файл снова через Add Existing Item...
После этого компиляция прошла успешно.

Теперь всё заработало. Ещё раз спасибо!!!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется тестовый проект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]