Неразрешенный внешний символ, встречающийся с файлами классов - PullRequest
0 голосов
/ 29 июля 2011

Первый момент: я не эксперт по C ++, это далеко не так. Я кратко взглянул на это почти год назад и больше ничего не трогал до тех пор, пока около 2 недель назад я не решил обучить себя DirectX на C ++. У меня была значительная доля ошибок, но я (по большей части) смог решить их самостоятельно. Я отказываюсь от этого, хотя. Насколько я могу судить, проблема заключается в том, как я использую файлы .h и .cpp класса mapCube, поэтому я опубликую их.

Сами ошибки немногочисленны, но приводят в бешенство: я получаю ССЫЛКУ: 2019 неразрешенную внешнюю ошибку символа, касающуюся всех функций mapCube , кроме конструкторов, она говорит мне, что на них ссылаются в основная программа но претензий они не инициализированы. Вторая известная мне ошибка связана с функцией checkColl: только в этой функции VC ++ 2010 решает, что x, y и z больше не являются частью класса mapCube, а скорее вызывает недоумение.

код: mapCube.h

#include <d3d9.h>
#include <d3dx9.h>
#include <dinput.h>

extern const float TILE_WIDTH, TILE_HEIGHT;
extern LPDIRECT3DDEVICE9 d3ddev;

// include the Direct3D Library files
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")

#ifndef MAPCUBE_H
#define MAPCUBE_H

class mapCube{
        struct CUSTOMVERTEX {FLOAT X, Y, Z; D3DVECTOR NORMAL; DWORD COLOR;};    //might be able to put these elsewhere
        #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)             //they are already in main, but mapCube needs them too
public:
    LPD3DXMESH cubeMesh;
    float x,y,z;
    void setCoord(float, float, float);
    D3DXVECTOR3 getCoord(){return D3DXVECTOR3(x,y,z);};
    mapCube();
    mapCube(float, float, float);
    mapCube(float, float, float, D3DXCOLOR);
    void draw(D3DXMATRIX);
    void setColor(D3DXCOLOR);
    int checkColl(D3DXVECTOR3, D3DXVECTOR3);
};

#endif

mapCube.cpp

#include "mapCube.h"

mapCube::mapCube()
{
    x=0;
    y=0;
    z=0;
    setColor(D3DCOLOR_XRGB(128,128,128));
} 

mapCube::mapCube(float nx, float ny, float nz)
{
    x=nx;
    y=ny;
    z=nz;
    setColor(D3DCOLOR_XRGB(128,128,128));
}

mapCube::mapCube(float nx, float ny, float nz, D3DXCOLOR color)
{
    x=nx;
    y=ny;
    z=nz;
    setColor(color);
}

void mapCube::setCoord(float nx, float ny, float nz)    //this function and the next one are both called
{                                                       //when the cube is created because I'm using
        x=nx;                                               //an array of cubes instead of one-by-one
    y=ny;
    z=nz;
};

void mapCube::setColor(D3DXCOLOR color)             //basically just colors each vertex 'color'
{
    LPD3DXMESH tmpMesh=NULL;

    D3DXCreateBox(d3ddev, TILE_WIDTH, TILE_HEIGHT, TILE_WIDTH, &tmpMesh, NULL);

    tmpMesh->CloneMeshFVF( 0, CUSTOMFVF, d3ddev, &cubeMesh );

    LPDIRECT3DVERTEXBUFFER9 tmpVertBuf=NULL;

if( SUCCEEDED(cubeMesh->GetVertexBuffer(&tmpVertBuf)))
{
    int nNumVerts = cubeMesh->GetNumVertices();
    CUSTOMVERTEX *pVertices = NULL;

    tmpVertBuf->Lock( 0, 0, (void**)&pVertices, 0 );
    {
            int i=0;
            while(i<nNumVerts)
            {
                pVertices[i].COLOR=color;
                i++;
            }
        }
    tmpVertBuf->Unlock();

    tmpVertBuf->Release();
    }
};

void mapCube::draw(D3DXMATRIX matWorld)
{
    D3DXMATRIX matTranslate;
    D3DXMatrixTranslation(&matTranslate,x,y,z);         //translation to the cubes stored coordinates

    d3ddev->SetTransform(D3DTS_WORLD, &(matTranslate * matWorld));      //...combined with the total world transform
    cubeMesh->DrawSubset(0);
};

int checkColl(D3DXVECTOR3 vecTest, D3DXVECTOR3 vecThis)         //2nd arg bc compiler decided to forget
{                                                               //that this class has x,y,z vars
    if(vecTest.x>=vecThis.x-(TILE_WIDTH/2.0f) || vecTest.x<=vecThis.x+(TILE_WIDTH/2.0f))    //rudimentary attempt at collision checking
    {
        return 1;
    }
    else if(vecTest.z>=vecThis.z-(TILE_HEIGHT/2.0f) || vecTest.z<=vecThis.z+(TILE_HEIGHT/2.0f))
    {
        return 2;
    }
    else
    {
        return 0;
    }
}

Извините, если форматирование немного отключено, я впервые использую этот интерфейс. Компилятор не сообщает ни о синтаксических ошибках, ни о каких-либо других, после того как я в любом случае изменил ссылки x / z в последней функции на переданный вектор D3D Любая помощь / критика приветствуются, относится ли она к d3d или c ++. Я не опубликовал основной источник, потому что я не думаю, что проблема там, но если меня спросят, я также опубликую его.

Следуя решению этой проблемы, теперь я замечаю это предупреждение: 1> Debug \ mapCube.obj: предупреждение LNK4042: объект указан более одного раза; дополнения игнорируются Я удалил дубликаты определений CUSTOMVERTEX и FVF и сделал их внешними в заголовке, но не могу решить эти проблемы.

Ответы [ 3 ]

0 голосов
/ 29 июля 2011

Вторая проблема легко решается: в реализации checkCollmapCube.cpp) отсутствует префикс mapCube::.Это заставляет компилятор думать, что это «свободная функция», а не функция-член mapCube.

0 голосов
/ 29 июля 2011

Возможно, вы забыли добавить mapCube.cpp в ваш проект VC ++. Добавьте эту строку в начало mapCube.cpp:

#error This file is indeed being compiled

Если эта строка не генерирует ошибку компилятора, то mapCube.cpp не компилируется.


Попробуйте перестроить решение. Иногда вещи не синхронизируются, и вам просто нужно перекомпилировать все с нуля.

0 голосов
/ 29 июля 2011

Просто подумал, что стоит указать на очевидное кровотечение, но включен ли mapCube.cpp в ваш проект?

...