Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> error LNK2005, ошибка при компиляции 
:(
    Опции темы
Esaul
Дата 9.9.2005, 21:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот решил перейти Visual C++ c CBuilder'a стал класс описывать, компилировал ..., вроде работало, а потом в дебагере получил:
ClassTMas error LNK2005: "public: __thiscall TMasV::TMasV(int)" (??0TMasV@@QAE@H@Z) already defined in ClassTMas.obj
ClassTMas error LNK2005: "public: __thiscall TMasV::~TMasV(void)" (??1TMasV@@QAE@XZ) already defined in ClassTMas.obj
ClassTMas error LNK2005: "public: void __thiscall TMasV::FillMasV(void)" (?FillMasV@TMasV@@QAEXXZ) already defined in ClassTMas.obj
ClassTMas error LNK2005: "public: void __thiscall TMasV::PrintMasV(void)" (?PrintMasV@TMasV@@QAEXXZ) already defined in ClassTMas.obj
ClassTMas fatal error LNK1169: one or more multiply defined symbols found
Помогите пожалуйста.
  Вверх
kometa_triatlon
Дата 9.9.2005, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код в студию
Посмотри по хелпу
Цитата
symbol already defined in object

The given symbol, displayed in its decorated form, was multiply defined.

Possible causes

Accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions.
The symbol is a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include symbol.
The symbol is defined differently in two member objects in different libraries, and both member objects were used.
An absolute is defined twice, with a different value in each definition.
A header file declared and defined a variable. Possible solutions include:
Declare the variable in .h: extern BOOL MyBool; and then assign to it in a .c or .cpp file: BOOL MyBool = FALSE;.
Declare the variable static.
Declare the variable selectany.
If you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib). For example:
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
already defined in uuid.lib(go7.obj)
To fix, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.




--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Esaul
Дата 10.9.2005, 07:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Help'a нету!
Код

/* Project ClassTMas */
#include "stdafx.h"

int main()
{
    int n;
    std::cout << "n: ";
    std::cin >> n;

    TMasV vec(n);
    
    vec.FillMasV;
    vec.PrintMasV;    

    getch();
    return 0;
}


Код

class TMasV
{
    public:
        const int n; //Размерность массива
        int *MasV;   //Указатель на массив

        TMasV(int t);
        ~TMasV();

        void FillMasV();   //Заполнение массива
        void PrintMasV();  //Печать массива
        int FindMaxMasV(); //Поиск max в массиве
};

TMasV::TMasV(int t): n(t)
{
    MasV = new int [n];
};
TMasV::~TMasV()
{
    delete[] MasV;
};
void TMasV::FillMasV()
{
    for(int i=0; i<n; i++)
        MasV[i]=i;
};
void TMasV::PrintMasV()
{
    for(int i=0; i<n; i++)
        std::cout << MasV[i] << std::endl; 
    
};
int TMasV::FindMaxMasV()
{
    return 0;
};

  Вверх
bilbobagginz
Дата 10.9.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



0. код который ты написал не обязаб работать так как в файле имеющем main() нет никакого отношения к классу TMasV. на среду разработки нельзя полагаться.

1. нет разделения на интерфейс-реализацию. нужен файл - интерфейс (заголовок) с объявлением класса и его методами, и другой с их реализациями. обычно делают так:
а) файл-заголовок ( interface )
Код

// filename: myclass.hh 
#ifndef _MYCLASS_H_
#define _MYCLASS_H_
class MyClass{
      public:
              int myint;
              MyClass();
              double GetSecret() const;
      private:
              double secret;
};
#endif

b) файл-реализация всех или части методов класса (implementation)
Код

// filename: myclass.cc
#include "myclass.hh"
#include <iostream>
using namespace std;
MyClass::MyClass(){
            secret=-0.1L;
            myint=3;
}
double MyClass::GetSecret() const{
            cout << "My Secret is: " << secret << endl;
            return secret;
}

c) теперь используем класс MyClass в proc.cc:
Код

// filname: proc.c
#include "myclass.hh"
int main(){
      MyClass mc;
      mc.GetSecret();
      return 0;
}


2. у тебя ";" после определения ( а не объявления ) всех функций. это необязательно.
3. в главной программе у тебя написано:
Код

    vec.FillMasV;
    vec.PrintMasV;    

ты скобочки забыл.

удачи.

Это сообщение отредактировал(а) bilbobagginz - 10.9.2005, 11:25


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Esaul
Дата 10.9.2005, 12:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











bilbobagginz спасибо. Сделал как ты показал, правда выдал ошибку на пункте b:
ClassTMas fatal error C1010: unexpected end of file while looking for precompiled header directive
затем в нем подключил "stdafx.h" и все заработало.
А поподробней нельзя про:
Код

#ifndef _MYCLASS_H_    
#define _MYCLASS_H_
...
#endif

  Вверх
kometa_triatlon
Дата 10.9.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это защита от повторного включения заголовочного файла. То есть, если большой проект и много заголовочных файлов, может случится, что какой-то хидер-файл включили несколько раз. Тогда возникают ошибки типа class redefinition. С этими директивами такое не пройдет.
Способ, кажется, устаревший smile Лучше используй
Код

#pragma once

Цитата

Specifies that the file will be included (opened) only once by the compiler in a build. This can reduce build times as the compiler will not open and read the file after the first #include of the module.



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
En_t_end
Дата 10.9.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



kometa_triatlon
Цитата(kometa_triatlon @ 10.9.2005, 17:01)
Способ, кажется, устаревший

Не способ устаревший, это просто Майкрософт опять своими нововведениями кормит. Им ведь не выгодно, чтобы код был портируемым smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
kometa_triatlon
Дата 10.9.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



En_t_end
Во всяком случае, короче smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
bilbobagginz
Дата 10.9.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Есаул. используй #ifdef, #define и #include smile
Есссно, при нужной ситуации.
a на самом деле почитай про пре-процессор.

ЗЫ
кстати... откуда пошло это "хидер"... вроде "хедер" .. если с английского.[плиз без обид]





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Esaul
Дата 13.9.2005, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот опять ошибкаsmile :
Project(Key) error C2512: 'ClassLock' : no appropriate default constructor available

ClassLock.h:
Код

/* Класс ClassLock класс мазаичного изображения замка */
#ifndef CLASSLOCK
#define CLASSLOCK    

class ClassLock
{
    public:
        const int n; //Размерность матрицы
        int **Matr;  //Указатель на матрицу

        ClassLock(int t);
        ~ClassLock();

        void GenMazLock();   //Создание маз. изображения замка
        void PrintMatr();    //Вывод маз. изображения замка
};
#endif


ClassLock.cpp
Код

#include "stdafx.h"
#include "ClassLock.h"

using namespace std;

ClassLock::ClassLock(int t): n(t)
{
    Matr = new int *[n];
    for(int i=0;i<n;i++)
        Matr[i]=new int[i];
}
ClassLock::~ClassLock()
{
    delete[] Matr;
}
void ClassLock::GenMazLock()
{
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            Matr[i][j]=rand()%2;
}
void ClassLock::PrintMatr()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            cout << Matr[i][j] << ' ';            
        cout << endl;
    }
}


ClassKey.h
Код

/* Класс ClassKey класс подбора ключей */
#include "ClassLock.h"

#ifndef CLASSKEY
#define CLASSKEY    

class ClassKey: public ClassLock
{
    public:
        const int n; //Размерность матрицы

        ClassKey(int t);
        ~ClassKey();

        void CopyMazLock(); //Создание маз. изображения замка
        void TurnKey();     //Создание маз. изображения замка
};
#endif


Ошибка сдесь.
ClassKey.cpp
Код

#include "stdafx.h"
#include "ClassKey.h"

using namespace std;

ClassKey::ClassKey(int t): n(t)
{/*<-Тут выдает ощубку */
    Matr = new int *[n];
    for(int i=0;i<n;i++)
        Matr[i]=new int[i];
}
ClassKey::~ClassKey()
{
    delete[] Matr;
}
void ClassKey::CopyMazLock()
{
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            Matr[i][j]=rand()%2;
}
void ClassKey::TurnKey()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            cout << Matr[i][j] << ' ';            
        cout << endl;
    }
}

PM MAIL   Вверх
Romikgy
Дата 13.9.2005, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Могу и ошибится , но зачем 2 раза объявлять
Цитата(Esaul @ 13.9.2005, 06:42)
const int n; //Размерность матрицы

в двух классах, тем более наследуемых?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 13.9.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Esaul
обшибка в том, что в конструкторе производного класса нужно явно вызывать конструктор базового, ибо no appropriate default constructor available (у базового класса нет конструктора по-умолчанию).
Т.е. должно быть так:

Код

ClassKey::ClassKey(int t): 
   ClassLock(t),
   n(t)
{
   ... 
}

Ну и Romikgy прав, разумеется. Это переопределение n, во-первых, очень нехорошее и может вызвать проблемы, во-вторых, нафиг никому не нужное.


--------------------
...
PM   Вверх
Esaul
Дата 13.9.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Earnest
Спасибо за помощь. А я то думал, что он к конструктору по умолчанию прикапывается.
Кстати если "n" повторно необъявить он выдаёт:
Project(Key) error C2614: 'ClassKey' : illegal member initialization: 'n' is not a base or member
С "n" вроде все работает.
И маленький вопрос:
Конструкторы не наследутся, а деструкторы наследуются?
PM MAIL   Вверх
JackYF
Дата 14.9.2005, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Конструкторы, как и деструкторы, не наследуются.

Конструктор базового класса просто вызывается до конструктора потомка, а деструктор базового после соответственно деструктора потомка.

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

З.Ы. Последнее можно делать всегда, независимо от того, есть ли в базовом классе конструктор по умолчанию (не закрытый).


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 21.9.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Esaul @ 13.9.2005, 19:04)
Кстати если "n" повторно необъявить он выдаёт:
Project(Key) error C2614: 'ClassKey' : illegal member initialization: 'n' is not a base or member
С "n" вроде все работает.

А ты его просто убери из инициализации: так инициализировать можно только члены данного класса, но не предков. n инициализируется в конструкторе базового класса. Если не уберешь n из производного класса, у тебя будут 2 различных n, а это нехорошо.
Добавлено @ 17:28
Цитата(Esaul @ 13.9.2005, 19:04)
Кстати если "n" повторно необъявить он выдаёт:
Project(Key) error C2614: 'ClassKey' : illegal member initialization: 'n' is not a base or member
С "n" вроде все работает.

А ты его просто убери из инициализации: так инициализировать можно только члены данного класса, но не предков. n инициализируется в конструкторе базового класса. Если не уберешь n из производного класса, у тебя будут 2 различных n, а это нехорошо.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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