Я писал свой код, объявил и определил все необходимые переменные и включил необходимые заголовочные файлы. Тем не менее он дает мне «неразрешенный внешний символ» для любых функций, используемых в конструкторе классов.
BowlingAlley.obj : error LNK2001: unresolved external symbol "private: void __thiscall BowlingAlley::addToMasterArray(int * const,int * const)" (?addToMasterArray@BowlingAlley@@AAEXQAH0@Z)
1>BowlingAlley.obj : error LNK2001: unresolved external symbol "private: void __thiscall BowlingAlley::createLaneArrays(void)" (?createLaneArrays@BowlingAlley@@AAEXXZ)
1>BowlingAlley.obj : error LNK2001: unresolved external symbol "int * laneVertices" (?laneVertices@@3PAHA)
Мой заголовочный файл выглядит следующим образом.
#pragma once
#include <stdio.h>
#include <iostream>
#include <array>class BowlingAlley
{
private:
void createLaneArrays();
void concatenateArrays(int array1[], int array2[], int containerArray[]);
int getNewArrayLength(int array1[], int array2[]);
//mutates an array creating the master draw array by using the two functions above
void addToMasterArray( int array2[], int masterArray[]);
public:
BowlingAlley(int width, int gHeight, int length);
BowlingAlley();
};
и реализация выглядит так
#include "BowlingAlley.h"#include <stdio.h>
#include <GL/glut.h>
#include <math.h>
#include <iostream>
using namespace std;
//BowlingAlley class contains all of the vertex information for the alley and the backdrop itself//the lane's vars
int laneVertices[];
int laneIndices[];
int alleyArray[];
int alleyLength;
int alleyWidth;
int guardHeight;BowlingAlley::BowlingAlley(int width, int gHeight, int length)
{
alleyLength = length;
alleyWidth = width;
guardHeight = gHeight;
createLaneArrays();
//the masterdrawarray doesn't exist yet, create it with size 0
int* masterDrawArray = new int[0];
//start adding the vert Arrays to the master array
addToMasterArray(laneVertices, masterDrawArray);
}
void createLaneArrays()
{
float laneVertices[]= {
-alleyWidth/2,0,0,
alleyWidth/2,0,0,
-alleyWidth/2,0,alleyLength,
alleyWidth/2,0,alleyLength
};
float laneIndices[]= {0,1,2,1,2,3};
}
int getNewArrayLength(int array1[], int array2[])
{
//the number of elements in arrays1/2
float array1Size = sizeof(array1)/sizeof(int*);
float array2Size = sizeof(array2)/sizeof(int*);
//the length of the new array
int newArrayLength = array1Size + array2Size;
//return it
return newArrayLength;
}
void concatenateArrays(int array1[], int array2[], int containerArray[])
{
//the number of elements in arrays1/2
float array1Size = sizeof(array1)/sizeof(int);
float array2Size = sizeof(array2)/sizeof(int);
//the length of the new array
int newArrayLength = array1Size + array2Size;
//loop through adding array1 to the new array
for (int i = 0; i<array1Size; i++)
{
containerArray[i] = array1[i];
}
//loop through adding array2 to the new array
for (int i = array1Size; i<newArrayLength; i++)
{
int j = i - array1Size;
containerArray[i] = array2[j];
}}
void addToMasterArray(int array2[], int masterArray[])
{
//create a temporary array to act as a kind of buffer whil we delete and reset the size of the drawing array
int* tempArray = new int[(sizeof(masterArray)/sizeof(int))];
//copy the contents over to the temp array.
for(int i =0; i<(sizeof(masterArray)/sizeof(int)); i++)
{
tempArray[i] = masterArray[i];
}
//delete what drawingArray points to
delete[] masterArray;
//calculate the size of the new array
int arrLength = getNewArrayLength(array2, masterArray);
//resurrect a new and extended drawingArray from the ashes, big enough to accomodate both arrays.
masterArray = new int[arrLength];
//use our previously made concatenateArrays function to append the two arrays
concatenateArrays(tempArray, array2, masterArray);
cout <<"The number of elements in the Master Array is: "<< sizeof masterArray/sizeof masterArray[0]<<endl;}
Затем создается объект и вызывается функция main в другом файле .cpp.
#include "BowlingAlley.h"#include <stdio.h>
#include <GL/glut.h>
#include <math.h>
#include "imageloader.h"#include "BowlingAlley.h"
//////////////////////////////////////////////
int main(int argc, char** argv)
{
glutInit(&argc, argv); // GLUT Initialization
glutInitDisplayMode(GLUT_DEPTH|GLUT_RGB|GLUT_DOUBLE); // Initializing the Display mode
glutInitWindowSize(800,600); // Define the window size
glutCreateWindow("Taken Bowl"); // Create the window, with caption.
printf("\n========== McLeanTech Systems =========\nBecoming Sentient");
init(); // All OpenGL initialization
BowlingAlley* myBowlingAlley = new BowlingAlley(100,30,1000); //make us a bowling alley//-- Callback functions ---------------------
glutDisplayFunc(display);
glutKeyboardFunc(mykey);
//glutMouseFunc(mymouse);
glutSpecialFunc(processSpecialKeys);
glutMainLoop(); // Loop waiting for event
}
Я просто не вижу, что я оставляю.
«Неразрешенные» методы вовсе не являются методами. Вы пропустили название класса.
Изменить:
void createLaneArrays()
чтобы:
void BowlingAlley::createLaneArrays()
и сделайте то же самое для других 2. Тогда они будут частью класса. Они не автоматически в класс только потому, что они находятся в том же файле, что и в C # или Java.
Потому что вы реализуете эту функцию без BowlingAlley::
префикс.
Таким образом, вы создаете новый набор функций (не методов вашего класса), и тогда пропускаются реализации.
void createLaneArrays()
{
float laneVertices[]= {
// ...
Должно быть:
void BowlingAlley::createLaneArrays()
{
float laneVertices[]= {
// ...
И то же самое для каждого из них.
И у вас есть еще одна ошибка в createLaneArrays()
где вы инициализируете локальную переменную laneVertices[]
вместо использования переменной класса.
Вы, вероятно, хотите:
laneVertices = new float[6];
И не забудьте удалить в деструктор (или же detroy
как функция):
delete [] laneVertices;