2010-11-14 2 views
0

Я ищу, чтобы их указывали в правильном направлении. У меня есть 1 класс событияПомощь с указателями, указателями на объекты и классы

class Event{ 
private: 
vector<string> Question; 
char Mode;// 1 = Ascending 2 = Descending 3 = None 
string EventName; 
public: 
    Event(string Name){ 
     EventName = Name; 
     SetQuestionSize(); 
     SetQuestion(); 
     Mode = 3; 
    } 

    void SetName(string NewName){ 
     EventName = NewName; 
    } 
    void SetQuestionSize(){ 
     Question.resize(15); 
    } 

    int ReturnQuestionSize(){ 
     return Question.size(); 
    } 

    void SetQuestion(){ 
     Question[0]="Enter "; 
     Question[1]="1 "; 
     Question[2]="to "; 
     Question[3]="sort "; 
     Question[4]="in "; 
     Question[5]="ascending "; 
     Question[6]="order, "; 
     Question[7]="2 "; 
     Question[8]="for "; 
     Question[9]="Descending, "; 
     Question[10]="or "; 
     Question[11]="3 "; 
     Question[12]="to "; 
     Question[13]="ignore "; 
     Question[14]=EventName; 
    } 

    string ReturnQuestion(int Index){ 
     return Question[Index]; 
    } 

    /*vector<string> ReturnQuestion(){ 
return Question; 
    }*/ 

    void SetMode(char NewMode){ 
if (NewMode == '0' || NewMode == '1' || NewMode == '2') 
Mode = NewMode; 
} 

    char ReturnMode(){ 
return Mode; 
    } 

    string ReturnName(){ 
     return EventName; 
    } 
}; 

Это будет членом второго объекта, который будет использовать функции Event для хранения данных в членах мероприятия.

Проблема, с которой я сталкиваюсь, объявляет массив объектов Event в моем втором объекте. При исследовании я сталкивался с путями использования массива указателей на первый объект, а некоторый оператор «->», который я предполагаю, связан с виртуальными функциями.

class WhatTheyWant{ 
    Event *events[2]; 
public: 
    WhatTheyWant(){ 
     events[0]= new Event("Miss"); 
     events[1]= new Event("Dodge"); 
    } 
}; 

Я очень невежественны об указателях, и я знаю, что я должен буду изучать их в конце концов, но они лучше всего идти или есть лучше.

+0

Я не был уверен в верстке сайта, но предположу, событие включает в себя вектор и строку библиотеку и WhatTheyWant включает в себя событие – Malaken

ответ

1

Поскольку ваш класс Event не имеет конструктора по умолчанию, вам нужно явно построить каждый объект с его именем, поэтому способ, которым вы сейчас это делаете, - это единственный способ сделать это.

Если добавить конструктор по умолчанию Event, вы можете сделать это, по крайней мере, двумя другими способами:

Если вы всегда будете иметь (небольшой) фиксированное количество объектов, вы можете просто объявить массив постоянной размер:

Event events[2]; 

Выполнение этого будет автоматически строить объекты при WhatTheyWant создается, так что вам просто нужно установить имена впоследствии:

WhatTheyWant() { 
    events[0].SetName("Miss"); 
    events[1].SetName("Dodge"); 
} 

Если вы хотите иметь переменное число событий, вы можете объявить один указатель и динамически выделять массив объектов:

Event *events; 

И вы, вероятно, можете дать номер в качестве параметра конструктора:

WhatTheyWant(int numEvents) { 
    events = new Event[numEvents]; 
    for (int i = 0; i < numEvents; i++) 
    events[i]->SetName("..."); 
} 

Кроме того, не имеет прямого отношения к вашему вопросу, но переменная Mode будет лучше моделируется с помощью перечисления вместо char.Использование enum делает его более ясным относительно того, что переменная на самом деле означает, вместо того чтобы использовать значение как 0, 1 и 2. Например:

public: 
    enum ModeType { Ascending, Descending, None }; 
private: 
    ModeType Mode; 
public: 
    Event() { 
    ... 
    Mode = Ascending; 
    } 
    void SetMode(ModeType NewMode) { 
    Mode = NewMode; 
    } 
    ModeType ReturnMode() { 
    return Mode; 
    } 
+0

Спасибо, что я сейчас просматриваю перечисление. Если я хочу создать третий объект, который действует на эту секунду, WhatWyWant, Object, я должен добавить функции mutator и доступа к WhatTheyWant? Эти функции-мутаторы и аксессоры будут, в основном, доступными к функциям мутатора и аксессуаров Event? – Malaken

+0

@Malaken: Да, наверное. Опять же, это зависит от того, что вы пытаетесь сделать. – casablanca

-1

В C++, указатели так же, как массивы

в вашем WhatTheyWant класса, вы определяете частный элемент:

Event *events[2]; 

Это массив массивов (2D массив) с переменной длиной (массивы) и 2 элемента в каждом массиве.

и оператор '->' используется, когда вы хотите получить доступ к (члену какого-либо объекта) и который называется указателем объекта (указателем, указывающим на объект), но когда вы определяете обычный объект переменная, которую вы используете '.' оператор.

Если у вас есть смелость и знания, чтобы использовать их, они очень полезны, но в целом они опасны, и поэтому новые языки, как правило, идут на управляемый путь.

+2

-1: Это сообщение полны стереотипов и городских мифов. Указатель действительно не просто как массивы. И они вообще не опасны. –

+0

Благодарим вас за разъяснения. «Это массив массивов (2D-массив) с переменной длиной (массивов) и 2 элемента в каждом массиве». плюс этот пример помог фрагменту информационного щелчка, который я раньше не мог понять. – Malaken

0

Вы можете использовать либо массив объектов или массив указателей.

Массив объектов, как показано ниже.

class WhatTheyWant{ 
    Event events[2]; 
public: 
    WhatTheyWant() 
    { 
     events[0] = Event("Miss"); 
     events[1] = Event("Dodge"); 
    } 
}; 

Примечание. Вам необходимо добавить конструктор по умолчанию к вашему классу событий для компиляции вышеуказанного подхода.

С помощью вышеуказанного подхода вам не нужно заботиться об освобождении объектов Event. Всякий раз, когда объект WhatTheyWant уничтожается, объекты событий уничтожаются.

Массив указателей приближается, как вы упомянули.

Но вам нужно позаботиться о освобождении выделенной памяти (если вы не используете auto_ptr или некоторый эквивалент C++ 0x). Исключение должно происходить в деструкторе, как показано ниже.

class WhatTheyWant{ 
    Event *events[2]; 
public: 
    WhatTheyWant(){ 
     events[0]= new Event("Miss"); 
     events[1]= new Event("Dodge"); 
    } 
    ~WhatTheyWant() 
    { 
     delete events[0]; 
     delete events[1]; 
    } 
}; 
+0

Спасибо, я поменю конструктор по умолчанию моего класса событий и попробую с массивом объектов и дам вам знать результаты Я угадываю ~ до того, как имя класса делает его деструктором? – Malaken

+0

@Malaken: Да, это синтаксис деструктора. – bjskishore123

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