我看到之前称为“'方法名''的帖子未在此范围内声明”,但答案根本没有帮助我。发生这种情况的方法是私有静态方法。我试图在课堂上使用它,但它不起作用。方法的名称是“nthCoeffCatalan”。我每次使用它时都会收到错误。我不知道这是否会有所帮助,但我正在使用带有wxWidgets的Code :: Blocks和用于编译器的Mingw32。 这是.h文件:
#ifndef CATALAN_H
#define CATALAN_H
#include <vector>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
class Catalan
{
public:
Catalan(int);
virtual ~Catalan( );
void recursiveRandomGenerator( );
void boltzmannRandomGenerator( );
int rank( );
void unrank(int, int);
void outputBinaryTree( );
void outputDyckPath( );
void outputTriangulation( );
private:
int n;
int catalanObject[];
int max_size;
static int nthCoeffCatalan(int);
};
#endif // CATALAN_H
这是.cpp文件:
#include <Catalan.h>
#include <math.h>
#include <time.h>
using namespace std;
int catalanObject[] = {};
int n;
int max_size;
Catalan::Catalan(int sz){
n = sz;
//find out the position of the leaf in a tree which is just a node and n-1 right vertices
max_size = 0;
for(int i = 0; i <=n; i++){
max_size += pow(2,i);
}
catalanObject[max_size];
for (int i = 0; i < max_size; i++){
catalanObject[i] = 0;
}
}
Catalan::~Catalan( ){
delete &n;
delete &max_size;
delete catalanObject;
}
void recursiveRandomGenerator( ){
//initialize the random number generator
srand(time(NULL));
int r = n;
int i = 0;
//give the tree a root
catalanObject[i] = 1;
r--;
//decide size of left and right trees
float x = ((float) (rand()%10000))/(10000.0);
int k = -1;
float s = 0;
int a_r = 0;
int b_k = 0;
int c_rk = 0;
//calculate a_r
if (r == 0){
a_r = 1;
}
else{
//calculate [x^r] in B(x)^2
if (r > 1){
for (int j = r/2; j >= 1; j--){
int temp = 0;
if (r%2 == 0 && j == r/2){
temp = nthCoeffCatalan(j);
temp = temp*nthCoeffCatalan(r-j);
}
else{
temp = nthCoeffCatalan(j);
temp = temp*nthCoeffCatalan(r-j);
temp = temp*2;
}
a_r += temp;
}
}
//calculate [x^r] in 2B(x)
a_r += 2*nthCoeffCatalan(r);
}
while (x > s){
k = k + 1;
//calculate b_k
if (k == 0){
b_k = 1;
}
else{
b_k = nthCoeffCatalan(k);
}
//calculate c_rk
if (k == r){
c_rk = 1;
}
else{
c_rk = nthCoeffCatalan(r-k);
}
//re-calculate s
int temp;
temp = (float) b_k;
temp = temp * (float) c_rk;
temp = temp / (float) a_r;
s += temp;
}
}
void boltzmannRandomGenerator( ){
}
int rank( ){
return 0;
}
void unrank(int rnk, int n){
}
void outputBinaryTree( ){
}
void outputDyckPath( ){
}
void outputTriangulation( ){
}
static int nthCoeffCatalan(int n){
int num = 1;
int den = 1;
int retVal = 0;
for(int i = 0; i < n; i++){
num = num*(n+i+1); // runs from n+1 to 2n (=2n!/n!)
den = den*(i+1); // runs from 2 to n (=n!)
}
retVal = num/den;
return retVal;
}
另外,作为旁注,我想使用数组作为类变量,但在构造函数中,在我初始化数组大小的行上,我的调试器说代码没有效果。我做错了吗?
答案 0 :(得分:1)
您错误地提供了全局函数的定义,但您实际上想要定义成员函数(其声明出现在Catalan
的类定义中)。
例如,.cpp
文件中的 :
static int nthCoeffCatalan(int n)
{
// ...
}
应该是:
int Catalan::nthCoeffCatalan(int n)
// ^^^^^^^^^
{
// ...
}
这也适用于其他非静态成员函数。例如(再次在.cpp
文件中)而不是:
void recursiveRandomGenerator( )
{
// ...
}
你应该写:
void Catalan::recursiveRandomGenerator( )
// ^^^^^^^^^
{
// ...
}
等等。
答案 1 :(得分:0)
所有成员函数定义都应该被认定为属于Catalan
。因此,例如,recursiveRandomGenerator
的定义应该看起来像:
void Catalan::recursiveRandomGenerator( ){
// ...
}
此外,您不应将static
关键字放在nthCoeffCatalan
的定义之前。它应该是这样的:
int Catalan::nthCoeffCatalan(int n){
// ...
}
答案 2 :(得分:0)
您的类定义声明了一堆成员函数,包括nthCoeffCatalan
。在源文件中,只定义了两个成员:构造函数和析构函数。所有其余功能都是免费功能。您必须将Catalan::
添加到其名称中,将它们标记为成员函数。