Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 03.05.2012, 21:28   #1
|wanderer|
 
Регистрация: 03.05.2012
Сообщений: 5
По умолчанию Ошибка линковки LNK 2019(С++)

Здравствуйте, уважаемые программисты!
Обращаюсь к Вам потому, что в моей первой программе с классами вылетает ошибка линковки, а что с ней делать - я не знаю. Помогите кто чем может (:

Код:
#include "stdafx.h"
#include "MyClass.h"
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
using namespace std;
 
class Matrix{
public:
int Matrix_(int newSizeX, int newSizeY);
int SetSize(int newSizeX, int newSizeY);
int ViewMatrix();
int ViewMatrix(int newSizeX, int newSizeY);
int sizeX, sizeY;
int i, j, n, m;
    double matrix[4][4];
 
Matrix ()
    {
i=0; n=0; m=0;
    }
 
    ~Matrix();
};
 
void main()
{ 
Matrix a;
a.Matrix_(4,4);
a.SetSize(4,4);
a.ViewMatrix();
a.ViewMatrix(4,4);
}
int Matrix::Matrix_(int newSizeX, int newSizeY){
time_t t;
sizeX=newSizeX;
sizeY=newSizeY;
cout <<"rows: " << endl;
cin >> n;
cout <<"columns: " << endl;
cin >> m;
double **matrix=new double *[n];
for (int i=0;i<n;i++)
{
  matrix[i] = new double [m];
}
srand ((unsigned) time(&t));
for (int i=0;i<n;i++)
    for (int j=0;j<m;j++)
{
    matrix[i][j]= (double)(rand()%60-30);
    
}
return 0;
}
int Matrix::SetSize(int newSizeX, int newSizeY){
int n, m=0;
cout <<"rows: " << endl;
cin >> n;
cout <<"columns: " << endl;
cin >> m;
double **matrix=new double *[n];
    for (int i=0;i<n;i++)
    {
      matrix[i] = new double [m];
    }  
 
return 0;
}
int Matrix::ViewMatrix(){
for (int i=0; i<sizeX; i++)
{
    for (int j=0; j<sizeY; j++)
    {
        cout <<(L" " , matrix[i,j])<< endl;
        }
    cout <<(L" ")<< endl;
}
return 0;
}
int Matrix::ViewMatrix(int newSizeX, int newSizeY){
if ((newSizeX>sizeX)||(newSizeY>sizeY)){
ViewMatrix();}
else {
    for (int i=0; i<newSizeX; i++)
    {
    for (int j=0; j<newSizeY; j++)
    {
    cout<<(L" " , matrix[i,j])<< endl;
    {
    cout<<(L" ")<< endl;}
    }
    }
}
return 0;
}
Текст ошибки:
error LNK2019: unresolved external symbol "public: __thiscall Matrix::~Matrix(void)" (??1Matrix@@QAE@XZ) referenced in function _main
C:\Users\пк\Documents\Visual Studio 2008\Projects\hhh\Debug\hh.exe : fatal error LNK1120: 1 unresolved externals


Заранее благодарю.
|wanderer| вне форума Ответить с цитированием
Старый 03.05.2012, 22:05   #2
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

Здесь вы хотели деструктор написать?
Код:
~Matrix();
Если эту строчку убрать, то ошибок тогда не будет.
Trigger man вне форума Ответить с цитированием
Старый 03.05.2012, 22:12   #3
|wanderer|
 
Регистрация: 03.05.2012
Сообщений: 5
По умолчанию

Да, по заданию требовалось использование конструктора и деструктора.
Ох, программа и в самом деле заработала.

А Вас не затруднит объяснить, почему так?
|wanderer| вне форума Ответить с цитированием
Старый 03.05.2012, 22:26   #4
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

А здесь конструктора вообще нет. А насчет деструктора. Даже не знаю нужен он здесь или нет. Динамически ничего не создается. У вас вот такая строчка есть.
Код:
int Matrix_(int newSizeX, int newSizeY);
Только это не конструктор.


Код:
Matrix::Matrix(int newSizeX, int newSizeY)
{
   ...
}

Matrix::~Matrix()
{
  ...
}

Последний раз редактировалось Trigger man; 03.05.2012 в 22:29.
Trigger man вне форума Ответить с цитированием
Старый 03.05.2012, 23:05   #5
|wanderer|
 
Регистрация: 03.05.2012
Сообщений: 5
По умолчанию

Задумывался как конструктор инициализации:

Код:
Matrix ()
    {
i=0; n=0; m=0;
    }
(Запись
Код:
Matrix::Matrix ()
    {
...
    }
преподаватель стер, потому что "конструктор находится не вне определения класса" )

а это задумывалось:

Код:
int Matrix_(int newSizeX, int newSizeY);
просто как метод класса.

Кажется, я запутался.
|wanderer| вне форума Ответить с цитированием
Старый 04.05.2012, 08:40   #6
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

Да нет, здесь все правильно. Извиняюсь, вчера уже поздно было и спать хотел. Вот и не заметил конструктор инициализации.
Вы возьмите также и деструктор прямо в классе и опишите ~Matrix() { };
Цитата:
преподаватель стер, потому что "конструктор находится не вне определения класса" )
А у нас наоборот говорят, что все конструкторы, деструкторы и другие функции должны находиться вне определения класса
Trigger man вне форума Ответить с цитированием
Старый 04.05.2012, 18:34   #7
|wanderer|
 
Регистрация: 03.05.2012
Сообщений: 5
По умолчанию

Спасибо за совет, реализация деструктора спасла положение.

Цитата:
Сообщение от Trigger man Посмотреть сообщение
А у нас наоборот говорят, что все конструкторы, деструкторы и другие функции должны находиться вне определения класса
Как обычно, каждый все рассматривает со своей колокольни.Но, поскольку я пока что в этих делах полный нуб, то уж лучше буду смотреть с той колокольни, на которую мне препод указал)

По поводу кода: хочется пристать с еще одним вопросом)
Единственное, что мне осталось сделать - это дописать меню.
Код:
int Matrix::Select(){
cout<<"Menu:"<<endl;
cout<<"1. Create matrix"<<endl;
cout<<"2. Set size"<<endl;
cout<<"3. View matrix"<<endl;
cout<<"4. View submatrix"<<endl;
cin>>key;
if (key==1){
	... else
if (key==2){
...else <<"this oprator isn't correct"<<endl;
где, для перехода к соответствующему методу, я хочу использовать указатель на функцию-член.Но что-то не получается.
(На примере метода Matrix_):
Я в описании класса дописываю:
Код:
int (Matrix::*p1)(int newSizeX, int newSizeY);
Инициализирую в конструкторе:
Код:
int (Matrix::*p1)(int newSizeX, int newSizeY)=&Matrix::Matrix_;
Вызываю:
Код:
if (key==1){
p1=&Matrix::Matrix_;}
В результате, после запуска, когда я выбираю 1 пункт меню, всё появляется кучей:
this operator isn't correct
rows:
columns:
rows:
columns:
И затем меня оттуда выбрасывает.

Последний раз редактировалось |wanderer|; 05.05.2012 в 00:29.
|wanderer| вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка линковки + вопрос hvz- Win Api 17 14.03.2012 21:47
Ошибка линковки! Hacker19_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.01.2012 05:43
Свой класс - ошибка линковки LNK2019: ссылка на неразрешенный внешний символ... Egyptorium Общие вопросы C/C++ 7 11.01.2012 16:48
Шаблонный класс, ошибка линковки revaldo666 Общие вопросы C/C++ 1 12.12.2011 14:57
Банальная ошибка линковки prouser Общие вопросы C/C++ 2 24.07.2011 03:22


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840