gpt4 book ai didi

C++ 头文件需要引用另一个类的函数

转载 作者:行者123 更新时间:2023-11-28 03:24:46 26 4
gpt4 key购买 nike

我现在已经将多态性与单个子类结合起来了。如以下代码所示,其中两个函数 Draw() 和 SetValue(int,int,int) 导致链接器错误。

 #include "Header.h"

class Object{
int tag;
public:
void SetValues(int,int,int);
void Draw();
int getTag(){
return tag;
}
};
class Square: public Object{
int red;
int green;
int blue;
void Draw();
void SetValues(int red2,int green2, int blue2){
red=red2;
green=green2;
blue=blue2;
}
};
void Square::Draw(){
// Draws a square with a gradient color at coordinates 0, 10
glBegin(GL_QUADS);
{
glColor3f(red, green, blue);
glVertex2i(1, 11);
glColor3f(red * .8, green * .8, blue * .8);
glVertex2i(-1, 11);
glColor3f(red * .5, green * .5, blue * .5);
glVertex2i(-1, 9);
glColor3f(red * .8, green * .8, blue * .8);
glVertex2i(1, 9);
}
glEnd();
}

错误

Error   1   error LNK2019: unresolved external symbol "public: void __cdecl Object::SetValues(int,int,int)" (?SetValues@Object@@QEAAXHHH@Z) referenced in function "public: void __cdecl State::DrawAll(void)" (?DrawAll@State@@QEAAXXZ)    C:\Users\Asher\documents\visual studio 2012\Projects\Procedural Terrain\Procedural Terrain\State.obj    Procedural Terrain
Error 2 error LNK2019: unresolved external symbol "public: void __cdecl Object::Draw(void)" (?Draw@Object@@QEAAXXZ) referenced in function "public: void __cdecl State::DrawAll(void)" (?DrawAll@State@@QEAAXXZ) C:\Users\Asher\documents\visual studio 2012\Projects\Procedural Terrain\Procedural Terrain\State.obj Procedural Terrain

在不继承 Object 函数的较大类中,使用 DrawAll() 并在其中调用 Draw()。cpp文件和两个各自的头文件如下。

#include "Header.h"
#include "Object.h"
float rotate_z=0;
class State{
private:
std::vector<Object> storage;
public:
State();
State Interpolate(State, State, double);
void Integrate(State,double, const double);
void DrawAll();
void AddObject(Object);
void RemoveObject(int);
};
State::State(){

}
State State::Interpolate(State current,State previous,const double alpha){
//current*alpha + previous * ( 1.0 - alpha );
return current;
}
void State::Integrate(State current, double t, const double dt){
}
void State::AddObject(Object object){
storage.push_back(object);
}
void State::RemoveObject(int tag){
//for(int i=0;i<storage.size;i++){
// if(storage.at(i).getTag==tag){
//storage.erase(storage.begin()+i);
// }
//}
}
void State::DrawAll(void)
{
// reset view matrix
glLoadIdentity();
// move view back a bit
glTranslatef(0, 0, -30);
// apply the current rotation

glRotatef(rotate_z, 0, 0, 1);
rotate_z += 5;
// by repeatedly rotating the view matrix during drawing, the
// squares end up in a circle
int i = 0, squares = 15;
float red = 0, blue = 1;
for (; i < squares; ++i){
Square square;
Object * squareP=&square;
glRotatef(360.0/squares, 0, 0, 1);
// colors change for each square
red += 1.0/12;
blue -= 1.0/12;
squareP->SetValues(red,0.6,blue);
squareP->Draw();
}
}

对象头 -

#ifndef Object_H
#define Object_H

class Object{
int tag;

public:
void SetValues(int,int,int);
void Draw();
int getTag();
};
class Square: public Object{
int red;
int green;
int blue;
void Draw();
void SetValues(int red2,int green2, int blue2);
};
#endif

最后是 State 标题 -

#ifndef State_H
#define State_H

#include "Object.h"
#include <vector>
class State{
private:
std::vector<Object> storage;
public:
State();
State Interpolate(State, State, double);
void Integrate(State,double, const double);
void DrawAll();
void AddObject(Object);
void RemoveObject(int);
};
#endif

这是我做的第一个C++项目,还没有完全从Java背景转过来。可能是什么问题?

最佳答案

你的 Object类没有实现 SetValues功能。您可能需要一个纯虚函数。同样适用于 Draw .

class Object {
virtual void SetValues(int,int,int) = 0;
}

另请注意,在 C++ 中,默认情况下函数不是虚函数。你必须使用 virtual基类中显式关键字。

还有 class Object似乎在多个地方定义。为什么?在 Object.h 中定义它就足够了。

此外,请缩进您的代码,因为它很难阅读。

还有 std::vector<Object>不会为所欲为! Unline Java,其中一切都是引用,在 C++ 中,事物按值存储在 std::vector 中。因此您的代码会受到切片问题的影响。您想在那里至少使用一个指针(std::vector<Object*>),但智能指针会更好(std::vector<std::shared_ptr<Object>>)

关于C++ 头文件需要引用另一个类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com