2015-03-19 3 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) 
} 

Я действительно смущен этим. Мне нужно вызвать функцию-член в другой, но моя проблема в том, что внутренний класс является вектором этих классов. Мой код должен работать, но результатом является segfault. Предположим, что функция cget имеет определение.C++, вызывающий вектор класса методов в другом классе

+0

Последняя строка, предположительно, является x. – James

+0

Нагрузка должна быть методом U? –

+0

'load()' может быть объявлен inline (т.е. внутри класса), например 'public: void load() {...}', или вам нужно добавить имя класса к имени функции, например 'void U :: load () {...} '. 'x' не инициализируется. И, наконец, 'c' пуст (что приводит к segfault при попытке доступа к его членам). – TobiMcNamobi

ответ

1

Вопрос немного неясен, но попробуйте это, чтобы предотвратить segfault.

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 
} 

EDIT: Сразу хочу отметить, что код в вопросе сильно изменился sinse мой ответ. Это объясняет, почему мой код выглядит совсем другим ;-) В любом случае ответ по-прежнему: проверьте размер c перед его доступом.

+0

. Я думаю, я нашел, где проблема. Причина segfault заключалась в том, что я не инициализировал вектор в этом блоке. Извините за проблемы с кодом. ;-) – James

Смежные вопросы