Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 14:18   #1
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию Свой класс - ошибка линковки LNK2019: ссылка на неразрешенный внешний символ...

Разбираюсь с классами C++. Мне нужной создать свой строковый класс. Перепечатал пример с книжки, а он не работает. Если переменные своего типа не использовать, то все нормально, а если подключать - выдает ошибки:

1>------ Построение начато: проект: Laba6, Конфигурация: Debug Win32 ------
1> Laba6.cpp
1>Laba6.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall LabString::~LabString(void)" (??1LabString@@QAE@XZ) в функции _wmain
1>Laba6.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall LabString::LabString(void)" (??0LabString@@QAE@XZ) в функции _wmain
1>D:\Миша\Visual Studio 2010\Projects\Laba6\Debug\Laba6.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


и код:

Код:
// Laba6.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "iostream"

using namespace std;

class LabString;
istream& operator>> ( istream&, LabString& );
ostream& operator<< ( ostream&, const LabString& );

class LabString {
public:
	LabString ();
	LabString ( const char* );
	LabString ( const LabString& );

	// деструктор
	~LabString ();

	// операторы присваивания
	LabString& operator= ( const LabString& );
	LabString& operator= ( const char* );

	// операторы проверки на равенство
	bool operator==( const LabString& );
	bool operator==( const char* );

	// перегрузка оператора доступа по индексу
	char& operator[] (int );

	// доступ к членам класса
	int size() {return _size; }
	char* c_str() {return _string; }

private:
	int _size;
	char *_string;
};

int _tmain(int argc, _TCHAR* argv[])
{
	LabString a; // если убрать эту строчку, то все нормально.
	system("pause");
	return 0;
}
Подскажите пожалуйста в чем может быть дело и что сделать, чтобы оно работало.

Последний раз редактировалось MaTBeu; 11.01.2012 в 14:34.
Egyptorium вне форума
Старый 11.01.2012, 14:26   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Тут у вас объявление конструктора. А где сам конструктор ( тело функции ) ? Вы его написали ?
строка
Код:
LabString a;
означает вызов конструктора
Код:
 LabString::LabString()
а линкер его не видит
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!

Последний раз редактировалось artush1984; 11.01.2012 в 14:34.
artush1984 вне форума
Старый 11.01.2012, 14:40   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
// Laba6.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "iostream"

using namespace std;

class LabString;
istream& operator>> ( istream&, LabString& );
ostream& operator<< ( ostream&, const LabString& );

class LabString {
public:
	LabString (){};
	LabString ( const char* param){ _string = new char[strlen(param) + 1]; strcpy(_string, param); _size = strlen(_string); };
	LabString ( const LabString& copy){_string = new char[copy.size()]; strcpy(_string, copy.c_str()); _size = copy.size(); };

	// деструктор
	~LabString () { if(_string) delete []_string; };

	// операторы присваивания
	LabString& operator= ( const LabString& ) {};
	LabString& operator= ( const char* ) {};

	// операторы проверки на равенство
	bool operator==( const LabString& ) {};
	bool operator==( const char* ) {};

	// перегрузка оператора доступа по индексу
	char& operator[] (int ) {};

	// доступ к членам класса
	int size() {return _size; }
	char* c_str() {return _string; }

private:
	int _size;
	char *_string;
};

int _tmain(int argc, _TCHAR* argv[])
{
	LabString a; // если убрать эту строчку, то все нормально.
	system("pause");
	return 0;
}
Плохо вы переписали с книжки. То, что отмечено красным допишете сами.
MaTBeu вне форума
Старый 11.01.2012, 15:13   #4
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию

Спасибо всем откликнувшимся!
Товарищ MaTBeu, теперь ругается на эту строчку
Код:
 LabString ( const LabString& copy){_string = new char[copy.size()]; strcpy(_string, copy.c_str()); _size = copy.size(); };
конкретно, на copy, пишет объект содержит квалификаторы типа, несовместимые с функцией - членом.

Ошибки:
1>------ Построение начато: проект: Laba6, Конфигурация: Debug Win32 ------
1> Laba6.cpp
1>d:\миша\visual studio 2010\projects\laba6\laba6\laba6.cpp (16): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\string.h(105): см. объявление "strcpy"
1>d:\миша\visual studio 2010\projects\laba6\laba6\laba6.cpp (17): error C2662: LabString::size: невозможно преобразовать указатель "this" из "const LabString" в "LabString &"
1> В результате преобразования теряются квалификаторы
1>d:\миша\visual studio 2010\projects\laba6\laba6\laba6.cpp (17): error C2662: LabString::c_str: невозможно преобразовать указатель "this" из "const LabString" в "LabString &"
1> В результате преобразования теряются квалификаторы
1>d:\миша\visual studio 2010\projects\laba6\laba6\laba6.cpp (17): error C2662: LabString::size: невозможно преобразовать указатель "this" из "const LabString" в "LabString &"
1> В результате преобразования теряются квалификаторы
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Egyptorium вне форума
Старый 11.01.2012, 15:42   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
LabString ( const LabString& copy){_string = new char[copy.size()]; strcpy(_string, copy.c_str()); _size = copy.size(); };
Уберите const, который отмечен красным.
MaTBeu вне форума
Старый 11.01.2012, 15:46   #6
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию

Не понос, так гонорея!
теперь все замечательно, но:
Когда закрываю программу пишет. Необработанное исключение в "0x103157aa (msvcr100d.dll)" в "Laba6.exe": 0xC0000005: Нарушение прав доступа при чтении "0xccccccc0".
P.S. сижу под рутом, какое нарушение прав?

В релизе :
ОС Windows инициировала точку останова в Laba6.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Laba6.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Laba6.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки


f12 я не нажимал.
Код:
 // Laba6.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "iostream"

using namespace std;

class LabString;
istream& operator>> ( istream&, LabString& );
ostream& operator<< ( ostream&, const LabString& );

class LabString {
public:
	LabString () {};
	LabString ( const char* param) {_string = new char[strlen(param) +1]; strcpy(_string, param); _size = strlen(_string);};
	LabString (LabString& copy){_string = new char[copy.size()]; strcpy(_string, copy.c_str()); _size = copy.size(); };

	// деструктор
	~LabString () { if (_string) delete []_string; };

	// операторы присваивания
	LabString& operator= ( const LabString& ) {};
	LabString& operator= ( const char* ) {};

	// операторы проверки на равенство
	bool operator==( const LabString& ) {};
	bool operator==( const char* ) {};

	// перегрузка оператора доступа по индексу
	char& operator[] (int ) {};

	// доступ к членам класса
	int size() {return _size; }
	char* c_str() {return _string; }

private:
	int _size;
	char *_string;
};

int _tmain(int argc, _TCHAR* argv[])
{
	LabString a;
	system("pause");
	return 0;
}

Последний раз редактировалось Egyptorium; 11.01.2012 в 16:16.
Egyptorium вне форума
Старый 11.01.2012, 16:48   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Попробуйте вот что
Код:
LabString () {};
замените на
Код:
LabString (): _string(NULL), _size(0) {};
и

Код:
~LabString () { if (_string != NULL) delete []_string; };
MaTBeu вне форума
Старый 11.01.2012, 17:48   #8
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию Cпасибо!

Спасибо! Вот это помогло!
Правда операторы не работают, выдают ошибку линковщика опять, с этим уже буду сам разбираться, Всем большое спасибо!
Egyptorium вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблонный класс, ошибка линковки revaldo666 Общие вопросы C/C++ 1 12.12.2011 15:57
Ошибка: ссылка на неразрешенный внешний символ Cthutq66a Помощь студентам 7 06.11.2011 12:10
Ссылка на неразрешенный внешний символ Xenogig Общие вопросы C/C++ 4 07.05.2011 19:11
error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup Zhivu igrayuchi Visual C++ 2 25.12.2010 16:48
Ссылка на неразрешенный внешний символ(error LNK2019) TheWanderer Общие вопросы C/C++ 2 07.08.2009 19:58