2014-02-11 69 views
1

我是初學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。有人可以糾正,如果這是一個編程錯誤,或者是由於我編譯的方式? 謝謝。

+0

目前還不清楚它是什麼你想要做的事。你正試圖將某些東西的長度改爲10 - 但是這是什麼東西?在你的代碼的那一點上,不存在任何具有「長度」的東西。 –

回答

1

這是一個編譯錯誤,您的代碼負責。您在Huffman課程中定義了length。它是該類的成員,而不是全局變量。

想象你的類是C Struct。你需要首先創建一個結構體才能訪問變量。同樣的事情適用於C++類。

嘗試Object1.length = 10;您創建您的類的實例。

編輯

你的目的,使用C++類,你會使用C結構。這將做到這一點。

我實際上會把Node結構聲明放在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中提問,但不要在問題中提出問題。

祝你好運!

+1

@MooingDuck OP表示他在C中創建了相同的程序。@ – ArthurChamz

+0

@MooingDuck感謝您的美麗回答。我還有一個疑問。我必須做「Node * tree; tree-> sym;」在main函數中(請再次參閱我的代碼中的我的類Huffman中的Struct)。如何構造Node *樹;樹形>符號;在main()範圍內工作?再次感謝.. – user3206225

+0

@ user3206225不客氣=) 節點類型是在你的班級內定義的。像Node *樹;你現在的結構是不可能的。像Object1.Node *樹;可能會訣竅。你想要做的是什麼? – ArthurChamz

4

length是該類的成員,因此它不在類的外部。

您可以創建Huffman類的對象之後訪問lenth如下

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

length是你的類,而不是主要的組成部分,因此編譯器是正確的。 成員屬於對象和liek這個被訪問:

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

長度屬於霍夫曼類。因此,它的定義後,你應該使用它Object1:

Huffman Object1(argv[1]); 

Object1.length = 10; 
1

length是你的類的可公開訪問的成員,但您首先需要一個類的實例,然後才能與會員做任何

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

...還行

2

你知道,public:並不意味着類樹中的任何內容都可以在任何地方訪問,它只是意味着你通過類似於Object.length的「點符號」來訪問類的實例變量。

但是,如果你真的想長到可以訪問任何地方,你應該把它聲明爲一個全局變量:

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