2015-03-19 82 views
-11
class C { 
    public: void c_set(int x){ a = x; } 
    private: int a; 
} 
; 
class U { 
    public: void load(); 
     c_loader(int i, int x){ c[i].c_set(x); }; 
    private: vector<C> c(20); 
} 
; 
void U::load() { 
    int x; 
    cin >> x >> i; 
    c_loader(i, x) 
} 

我真的很困惑這個。我需要在另一個成員函數中調用,但是我的問題是內部類是這些類的向量。我的代碼應該工作,但結果是段錯誤。設定功能cget有定義。C++在另一個類中調用類的方法向量

+0

最後一行a假設爲x。 – James 2015-03-19 12:00:29

+0

負載應該是U的一種方法嗎? – 2015-03-19 12:04:04

+0

''load()''可以像'public:void load(){...}一樣在內部聲明(也就是在類內部),或者你必須在類名前面加上'void U :: load ){...}'。 'x'未初始化。最後'c'是空的(當你試圖訪問它的成員時會導致段錯誤)。 – TobiMcNamobi 2015-03-19 12:04:58

回答

1

這個問題有點不清楚,但試試這個來防止段錯誤。

class C { 
    public: void cget(int a); 
    private: int a; 
}; 

class U { 
    public: void load(); 

    vector<C> c; // Note: c is made public in order to add elements from main 
}; 

void U::load(unsigned x, int a) { 
    if (x < c.size()) // Check the size of c _before_ access 
    { 
    c[x].cget(a); 
    } 
} 

void main() 
{ 
    U u; 
    C c; 
    u.c.push_back(c); 
    u.load(0, 3); // Will end up calling cget 
    u.load(1, 3); // Will just return without calling cget 
} 

編輯: 只是想提一提的是,在問題的代碼已經改變了很多sinse我的答案。這就解釋了爲什麼我的代碼看起來完全不同;-) 在任何情況下,答案仍然是:在訪問它之前檢查c的大小。

+0

我想我找到了問題所在。段錯誤的原因是我沒有在這個塊中初始化矢量。對於代碼中的問題抱歉。 ;-) – James 2015-03-19 12:50:37