繁体   English   中英

错误:未在此范围c中声明“长度”

[英]error: ‘length’ was not declared in this scope c++

我是初学者c ++程序员,这甚至是我的第一个程序(对于那些非常想给出反面的人)。 我用c编写了相同的代码,但是现在尝试用c ++编写。 我在哪里得到以下错误。

error: 'length' was not declared in this scope

我的代码如下。

#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;


 class Huffman
 {
    public:

    int data_size, length; //THis length variable is not accessible in main function below in main function.
     Huffman(char *filename);
   ~Huffman();

    struct Huffman1
    {
    int value;
    unsigned char sym;                 /* symbol */
    struct Huffman1 *left,*right;    /* left and right subtrees */
    };   typedef struct Huffman1 Node;

 };

 Huffman::Huffman(char * file_name)
 {

 //I will do something here soon

 }
  Huffman::~Huffman()
 {

 }


 int main(int argc, char * * argv)
 {
      length=10; //Not accessible here.
     if (argc < 2)
    {
        cout<<"Ohh.. Sorry , you forgot to provide the Input File please" <<endl;
        return(0);
    }
     Huffman Object1(argv[1]);

     return(0);


}

我不确定这是c ++编程错误,因为可能是因为我正在编译它g++ Filename.c -o filename 有人可以纠正是由于编程错误还是由于我的编译方式引起的? 谢谢。

length是类的成员,因此它在类外部不存在。

创建Huffman类的对象后,可以按如下方式访问lenth

Huffman Object(argv[1]);
Object.length = 10;

长度属于霍夫曼类。 因此,在定义后,应将其用于Object1:

Huffman Object1(argv[1]);

Object1.length = 10;

您知道, public:这并不意味着放在类树的该分支下的任何内容都可以在任何地方访问,只是意味着您可以通过Object.length之类的“点符号”来访问类的实例变量。

但是,如果您确实希望在任何地方都可以访问长度,则应将其声明为全局变量:

short int length;
class Huffman{
...
};
...

length是类的一部分,而不是main的一部分,因此编译器是正确的。 成员属于一个对象,可以这样访问:

Huffman huffmannObj(...);
std::cout << huffmannObj.length << std::endl;

length是您的类的一个公共可访问成员,但是在对该成员执行任何操作之前,您需要首先该类的实例

Huffman h(whatever_constructor_params);
h.length = 10;

...还可以

这是一个编译错误,您的代码负责。 您在Huffman类中定义了length 它是该类的成员,而不是全局变量。

想象您的课程是C结构。 您需要先创建一个结构才能访问该变量。 同样的情况适用于C ++类。

尝试Object1.length = 10; 您创建类的实例。

编辑

为了您的目的,请像使用C结构一样使用C ++类。 这样就可以了。

我实际上会将Node struct声明放在Huffman类之外。 我认为这更容易理解。 同样,在这些情况下,对C使用++的typedef并不是真正有用的,仅通过声明该结构即可使用该结构的名称。

指针不为结构本身分配内存。 只有在分配内存后,它们才可用,即使它们是Object1成员,所以您也需要它。

#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;

struct Node
{
    int value;
    unsigned char sym;                 /* symbol */
};

 class Huffman
 {
    public:

    int data_size, length; //THis length variable is not accessible in main function below in main function.
     Huffman(char *filename);
   ~Huffman();

    Node *left,*right;    /* left and right subtrees */

 };

 Huffman::Huffman(char * file_name)
 {

 //I will do something here soon

 }
  Huffman::~Huffman()
 {

 }


 int main(int argc, char * * argv)
 {
      length=10; //Not accessible here.
     if (argc < 2)
    {
        cout<<"Ohh.. Sorry , you forgot to provide the Input File please" <<endl;
        return(0);
    }
     Huffman Object1(argv[1]);

     Object1.left  = new Node;
     Object1.right = new Node;

     //Do your stuff here...
     Object1.left->sym;

     return(0);


}

这应该使您入门,但这绝不是一个完美的实现。 它甚至都不是面向C ++的,但是我已经给出了答案。 这是一个非常不同的问题的主题,欢迎您在SO中提问,但请尽量不要在问题中提出疑问。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM