Почему мой код генерирует «Неразрешенный внешний символ»? ошибка?

Я писал свой код, объявил и определил все необходимые переменные и включил необходимые заголовочные файлы. Тем не менее он дает мне «неразрешенный внешний символ» для любых функций, используемых в конструкторе классов.

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
}

Я просто не вижу, что я оставляю.

0

Решение

«Неразрешенные» методы вовсе не являются методами. Вы пропустили название класса.

Изменить:

void createLaneArrays()

чтобы:

void BowlingAlley::createLaneArrays()

и сделайте то же самое для других 2. Тогда они будут частью класса. Они не автоматически в класс только потому, что они находятся в том же файле, что и в C # или Java.

6

Другие решения

Потому что вы реализуете эту функцию без BowlingAlley:: префикс.

Таким образом, вы создаете новый набор функций (не методов вашего класса), и тогда пропускаются реализации.

void createLaneArrays()
{
float laneVertices[]= {
// ...

Должно быть:

void BowlingAlley::createLaneArrays()
{
float laneVertices[]= {
// ...

И то же самое для каждого из них.

И у вас есть еще одна ошибка в createLaneArrays()где вы инициализируете локальную переменную laneVertices[] вместо использования переменной класса.

Вы, вероятно, хотите:

laneVertices = new float[6];

И не забудьте удалить в деструктор (или же detroy как функция):

delete [] laneVertices;
3

По вопросам рекламы [email protected]