C++ &引用;“类型”;不引用C+上的值+;
我在OpenFrameworks artwork上遇到了这个错误。但是看起来是一个简单的C++问题。C++ &引用;“类型”;不引用C+上的值+;,c++,pointers,openframeworks,C++,Pointers,Openframeworks,我在OpenFrameworks artwork上遇到了这个错误。但是看起来是一个简单的C++问题。 ofVec2f does not refer to a value 当然,我在指针方面有问题,但我不明白为什么。 我试图改变&->* canvas4.cpp void Canvas4::createStuff() { ballCollection.clear(); for (int i=0; i<num; i++) { ofVec2f org;
ofVec2f does not refer to a value
当然,我在指针方面有问题,但我不明白为什么。
我试图改变&->*
canvas4.cpp
void Canvas4::createStuff() {
ballCollection.clear();
for (int i=0; i<num; i++) {
ofVec2f org;
org.set(ofRandom(edge, ofGetWidth()-edge), ofRandom(edge, ofGetHeight()-edge));
float radius = ofRandom(50, 150);
ofVec2f loc;
loc.set(org.x+radius, org.y);
float offSet = ofRandom(TWO_PI);
int dir = 1;
float r = ofRandom(1);
if (r>.5) dir =-1;
myBall = new Ball(org, loc, radius, dir, offSet);
ballCollection.push_back(* myBall);
}
//
标题画布4.h
class Ball {
public:
ofVec2f org;
ofVec2f loc;
float sz = 10;
float theta, radius, offSet;
int s, dir, d = 60;
Ball(ofVec2f &_org, ofVec2f &_loc, float _radius, int _dir, float _offSet);
};
class Canvas4{
public:
int fc = 100;
int num = 100;
int edge = 200;
vector<Ball> ballCollection;
Boolean save = false;
ofFbo fbo;
Ball *myBall;
Canvas4();
};
班级舞会{
公众:
ofVec2f组织;
ofVec2f-loc;
浮点数sz=10;
浮点θ、半径、偏移量;
int s,dir,d=60;
球(ofVec2f和ofVec2f和OF loc,浮动半径,int dir,浮动偏移);
};
班级拉票4{
公众:
int fc=100;
int num=100;
int edge=200;
向量收集;
布尔保存=假;
ofFbo fbo;
球*我的球;
游说4();
};
< /代码> 不需要查看整个,但在我的头脑中,C++编译器会将变量名级联为未声明的类型,如果它们的类型也未声明,尽管在那里可以看到无类型变量是int,导致各种愚蠢。p>
除此之外,检查您所拥有的内容是否包含ofVec2,并查看它位于哪个名称空间中。比如,如果ofVec2f位于某个名称空间中,则需要使用名称空间名称;或者,更可取的是,使用其名称空间前缀引用ofVec2f。所有问题都是单个“}”的泄漏,不关闭Canvas::createStuff()方法
很抱歉这个问题
是否应该删除线程?如果使用点(
)运算符而不是作用域(:
)运算符调用静态方法,也会导致此错误。在哪个构造函数调用中会发生错误?在myBall=新球(组织、位置、半径、方向、偏移量)代码>或在球集合中。向后推(*myBall)代码>?@TobiMcNamobi这一个球::球(ofVec2f和ofVec2f和ofVec2f和OF loc,浮点半径,int dir,浮点偏移量)明白了。但是堆栈跟踪的下一步是什么?名为“Canvas4::createStuff()”
的构造函数将像筛子一样在这些行中泄漏内存:myBall=newball(org、loc、radius、dir、offSet);收集球。向后推球(*myBall)代码>将其更改为ballCollection.push_back(球(组织、位置、半径、方向、偏移))代码>绝对没有理由在那里动态分配内存。问题不在这里,但是在C和C++中,标识符从下划线开始(或者包含双下划线)被保留。如果您使用它们并且运气不好,则可能会与编译器特定的关键字、标准库内部构件等发生冲突。一个尾随下划线(例如,hello
)就可以了。这是我多年前经常犯的一个错误,因为我看了编译器提供的头文件,认为它们是一个很好的模仿例子。如果需要参数的命名约定,最常见的似乎是使用pname
、p_name
、pname
等。类成员使用m
的前缀也很常见。ovVec2f
是一个简单的二维向量类,请参阅。如果没有正确地包含头,或者实现链接错误,那么将分别出现编译器或链接器错误。但是从上面的描述中,我发现OP出现了运行时错误,我下载了框架并查看了ofVec2f的源文件。它不在任何名称空间中,所以可能他没有包括它。他在抱怨一个编译器错误。也许,见鬼,他可以试着把“ofVec2f.h”放在文件的顶部。然后从那里,也许可以确保src在他的include路径中。但是,在没有看到整个项目的情况下,很难判断。不,让它打开。让人们知道他们正在遇到这个问题是件好事。。。。我应该想,哦,坏类型也可能是一个畸形支架的信号。
class Ball {
public:
ofVec2f org;
ofVec2f loc;
float sz = 10;
float theta, radius, offSet;
int s, dir, d = 60;
Ball(ofVec2f &_org, ofVec2f &_loc, float _radius, int _dir, float _offSet);
};
class Canvas4{
public:
int fc = 100;
int num = 100;
int edge = 200;
vector<Ball> ballCollection;
Boolean save = false;
ofFbo fbo;
Ball *myBall;
Canvas4();
};