2014-01-16 234 views
0

我處於C++項目的中間,並且出現了「未在此範圍內聲明」的衆所周知的錯誤。特別是「vexp沒有在這個範圍內聲明」。正如你可以在下面看到的,vexp是在Exploration類中聲明的一個向量,雖然我在main中包含了Exploration.h,但是vexp不可訪問。另一方面,Exploration :: vexp不可接受,因爲vexp不是靜態的。 正在使vexp靜態從主要訪問它的唯一方法?未在此範圍內聲明C++

#include "exploration.h" 
#include <iostream> 
#include <vector> 

int main() 
{ 

    std::srand (time(NULL)); 

    for(int i=1; i<9; i++) 
    { 
     Exploration temp (0,3,3); 
     vexp.push_back(temp); 
    } 
    for(int j=0; j<(int)Exploration::vexp.size(); j++) 
    { 
     std::cout << Exploration::vexp[j].Vertical; 
     std::cout << Exploration::vexp[j].Horizontal; 
     std::cout << Exploration::vexp[j].r; 
     std::cout << '\n'; 
    } 

    return 0; 
} 

和標題:

#ifndef EXPLORATION_H 
#define EXPLORATION_H 
#include<vehicle.h> 
#include <vector> 

class Exploration : public vehicle 
{ 
    public: 
    std::vector <Exploration> vexp; 
    Exploration(bool,float,int); 
    int r; 
    void DangerCheck(); 
    bool expaxis(int k); 
}; 
#endif // EXPLORATION_H 
+0

一旦你縮進代碼正確,你看到你忘記關閉主函數上的大括號。 – RedX

+0

爲什麼你要訪問'vexp'就好像它是第二個for循環中的靜態成員? – Ancurio

+1

除此之外,課堂設計看起來很奇怪。只有公衆成員?主要有公衆成員?這根本就不是封裝。一旦你解決了這個問題,你可能不再需要這個問題的答案了。 – stijn

回答

2

vexpExploration的非靜態成員。您創建的每個Exploration對象都將擁有自己的vexp成員。因此要訪問vexp,您需要有一個Exploration對象。也就是說,下面將工作:

Exploration exp1(false, 3.0f, 5); 
Exploration exp2(true, 6.0f, 10); 
exp1.vexp.push_back(exp2); 

請注意,我訪問的exp1vexp成員與exp1.vexp。那是屬於那個特定Exploration對象的向量。對那個矢量我推exp2

你究竟需要做什麼取決於你想要做什麼,而且我不確定。看起來你並沒有完全掌握面向對象的原理。應該清楚,因爲vexpExploration的非靜態成員,所以在創建Exploration對象之前它不存在。也就是,每個Exploration對象擁有更多Exploration對象的容器。

看起來好像你只是想要一個不是Exploration的成員的std::vector<Exploration>。所以你只需要一個Exploration的容器,而不是其他的Exploration s。對於這一點,你就只是做:

int main() 
{ 
    std::srand (time(NULL)); 
    std::vector<Exploration> vexp; // vexp has been moved here 

    for(int i=1; i<9; i++) 
    { 
     Exploration temp (0,3,3); 
     vexp.push_back(temp); 
    } 
    for(int j=0; j < vexp.size(); j++) 
    { 
     std::cout << vexp[j].Vertical; 
     std::cout << vexp[j].Horizontal; 
     std::cout << vexp[j].r; 
     std::cout << '\n'; 
    } 
} 

注意vexp現在宣佈當地爲main功能,應該從Exploration類中刪除。

+0

vexp是探索類對象的向量.. – alex777

+0

@ alex777看我的代碼示例。我認爲這是你真正想要的。 'vexp'不應該是Exploration的成員。 –

+0

感謝您的好評。我想要做的是在for循環中創建對象並將它們推入矢量中。事實上,我還沒有很好地掌握C++的「靜態成員」部分。 – alex777

1

您有權訪問vexpExploration對象的成員,如果你不想讓它靜恩。

temp.vexp.push_back(something); 

但它似乎並不像你想要的那樣。在你的情況下,你應該讓它成爲靜態或全局變量。

+0

的確我不想那樣做,因爲vexp是一個類型探索的向量,因此它包含了類探索的對象。 – alex777

+0

感謝您的回答 – alex777

0

vexpExploration類的成員變量,所以它應該有一流的Exploration

temp.vexp.push_back(SomeVariable); 

的情況下使用,但,這是不推薦申報的成員變量public和使用這樣的外部類。

+0

我不希望這樣,因爲vexp包含類探索 – alex777

+0

的對象,那麼你將不得不移動你的vexp在主.. –

+0

某處,謝謝,這是我在這篇文章之前做的,但我不喜歡它作爲設計,所以我試圖把每個向量放在特定的類中。 – alex777

0

就拿vexp出類:

std::vector<Exploration> vexp; 

和:

for(int j=0; j<vexp.size(); j++) 
{ 
    std::cout << vexp[j].Vertical; 
    std::cout << vexp[j].Horizontal; 
    std::cout << vexp[j].r; 
    std::cout << '\n'; 
} 
+0

這是它以前是如何..我不喜歡它作爲一種設計。 – alex777

+0

爲什麼你想要一個不同的設計? –

+0

因爲如果矢量是在main中聲明的,那麼我不能在類方法中訪問它們 – alex777

0

vexp意思是所有Exploration s的名單?如果是這樣,您需要在Exploration類的外部之外聲明。你可以做你的

Exploration temp (0,3,3); 
vexp.push_back(temp); 

它應該很好。

如果在另一方面,它的意思是連接到一個特定的Exploration載體,則這部分非常混亂:

Exploration temp (0,3,3); 
    vexp.push_back(temp); 

您需要,而不是像

Exploration myExpl; 
    for(int i=1; i<9; i++) 
    { 
     Exploration temp (0,3,3); 
     myExpl.vexp.push_back(temp); 
    }