#c #visual-c
#c #visual-c
Вопрос:
мой проект содержит несколько классов (1 из них — Point3D) и cpp (CreatePoint.cpp ) и заголовочный файл (CreatePoint.h).
мой файл stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
#include "CreatePoint.h"
#include "Point3D.h"
#include "Vector3D.h"
#include "Sys.h"
мой файл CreatePoint.h
#include "stdafx.h"
#pragma once
#include "Point3D.h"
//*******************************************************************
void initialise();
//*******************************************************************
Point3D *get_point(int);
//*******************************************************************
int get_index(Point3D *);
//*******************************************************************
Point3D *create_point();
//*******************************************************************
void del_point(Point3D *);
//*******************************************************************
void destruct_point();
мой CreatePoint.cpp файл является
#include "stdafx.h"
#include "CreatePoint.h"
int counter;
int size = 50;
Point3D *point[];
//*******************************************************************
void initialise()//run this func each time point[] is created
{
counter = 0;
for(int i = 0; i<size; i )
{
point[i] = '';
}
}
//*******************************************************************
Point3D *get_point(int index)
{
return point[index];
}
//*******************************************************************
int get_index(Point3D *p)
{
for(int i = 0; i<size; i )
{
if(point[i] == p)
return i;
}
}
//*******************************************************************
Point3D *create_point()
{
point[counter] = new Point3D;
counter ;
return point[counter];
}
//*******************************************************************
void del_point(Point3D *p)
{
int d = get_index(p);
delete point[d];
}
//*******************************************************************
void destruct_point()
{
delete [] point;
}
я получаю ошибку во время выполнения :
CreatePoint.obj : error LNK2001: unresolved external symbol "class Point3D * * point" (?point@@3PAPAVPoint3D@@A)
1>C:Documents and Settingsmy documentsvisual studio 2010ProjectsMathsDebugMaths.exe : fatal error LNK1120: 1 unresolved externals
я искал в Интернете, и в основном причиной такого сбоя является отсутствие stdafx.h в 1-й строке каждого файла… но я уже включил ее.
я также получаю некоторое предупреждение для последней функции destruct_point() ->
mathsmathscreatepoint.cpp(51): warning C4154: deletion of an array expression; conversion to pointer supplied
Комментарии:
1.
LNK2001
это ошибка компоновщика, а не ошибка времени выполнения.
Ответ №1:
LNK2001
это ошибка компоновщика, а не ошибка времени выполнения.
Point3D *point[];
похоже, это объявление, но не создание экземпляра. То есть эта строка сообщает компилятору, что эта переменная будет существовать где-то позже. Потому что массивы должны иметь размер для создания экземпляра. (Я даже не знал, что [] без размера разрешен в этой области)
Измените это на Point3D *point[size];
, и это фактически создаст массив. Кроме того, size
должно быть a const int
.
[Править]
destruct_point()
пытается удалить весь массив точек. Поскольку массив распределен статически, это недопустимо. Поскольку у вас уже есть функция для удаления отдельных точек, я не могу себе представить, почему эта функция существует. Поскольку массив не был объявлен с new[]
помощью, вы НЕ должны использовать delete[]
его.
Комментарии:
1. …большое спасибо, это сработало… но как насчет предупреждения, которое я упомянул в конце?
2. Вы не выделили массив с
new[]
помощью, поэтому он вам не нуженdelete[]
. Вам не нужна эта функция.3. я узнал в msdn, что это должно быть delete [] amp;point; msdn.microsoft.com/en-us/library/f7h7y2d3.aspx еще раз большое спасибо..
4. @CAD_coding: НЕТ. Массив в их демонстрации выделяется
new[]
в седьмой строке. У вас нет. Вы не должны использоватьdelete[]
илиdelete
на нем ни один из них.