2013-05-04 3 views
-1

Я хочу создать файл, в котором я могу добавить Лица в PersonList, включая счетчик, который гарантирует, что пропускная способность PersonList не будет превышена. Я прокомментировал все функции, чтобы четко определить, какие задачи они должны выполнять.Недопустимое использование нестатического элемента данных

Во время компиляции я получаю следующее сообщение об ошибке:

invalid use of non-static data member 'PersonList::m_Capacity' 

К сожалению, я не могу понять, что плохого в коде:

main.cpp

#include <iostream> 
#include "Person.h" 
#include "PersonList.h" 

int main() 
{ 

    Person p1 = Person("John", 21); 
    Person p2 = Person("Elham", 19); 
    PersonList p_list = PersonList(); 

    p_list.add(p1); 
    p_list.add(p2); 

    std::cout << p_list.get_Size() << std::endl; 
    Person p = p_list.get(0); 
    std::cout << p.get_Name() << " " << p.get_Age() << std::endl; 

    return 0; 
} 

Person.h

#ifndef PERSON_H 
#define PERSON_H 

class Person 
{ 
    public: 
     Person(); 
     Person(std::string Name, int Age); 

     void set_Name(std::string name); 
     void set_Age(int age); 
     std::string get_Name(); 
     int get_Age(); 

    private: 
     std::string m_Name; 
     int m_Age; 
}; 

#endif // PERSON_H 

Person.cpp

#include <string> 
#include "Person.h" 

Person::Person(){} 

Person::Person(std::string Name, int Age){ 
// pre: 0 <= Age 
// post: m_Name, if pre Name (is true) Age = m_Age, 
//  otherwise age = -1 

    set_Name(Name); 

    if (0 <= Age){ 

     set_Age(Age); 
    } 

    else{ 

     set_Age(-1); 
    } 

} 

void Person::set_Name(std::string Name){ 
// post: m_Name = Name 

    m_Name = Name; 
} 

void Person::set_Age(int Age){ 
// pre: 0 <= Age 
// post: if pre Age (is true) = m_Age, otherwise m_Age = -1; 

    if (0 <= Age){ 

     m_Age = Age; 
    } 

    else set_Age(-1); 
} 

std::string Person::get_Name(){ 
// post: returns name 

    return m_Name; 
} 

int Person::get_Age(){ 
// post: returns age 

    return m_Age; 
} 

PersonList.h

#ifndef PERSONLIST_H 
#define PERSONLIST_H 

class PersonList 
{ 
    public: 
     PersonList(); 

     void add(Person p); 
     void set_Size(int Size); 
     int get(int index); 
     int get_Size(); 

    private: 
     const int m_Capacity; 
     const Person m_Empty; 
     Person m_Data[m_Capacity]; 
     int m_Size; 

}; 

#endif // PERSONLIST_H 

PersonList.cpp

#include "Person.h" 
#include "PersonList.h" 

PersonList::PersonList() 
m_Capacity(10), m_Empty(Person()) 
{ 
// post: has created a new PersonList-object with 
//  CAPACITY elements and size = 0 

    set_Size(0); 
} 

void PersonList::add(Person p){ 
// pre: size < CAPACITY 
// post: if pre (is true) p has been stored at the 
//  first empty location. size was incremented. 

    if (m_Size < m_Capacity){ 

     m_Data[m_Size] = p; 
     set_Size(m_Size+1); 
    } 

} 

void set_Size(int Size){ 

    m_Size = Size; 
} 

int PersonList::get(int index){ 
// pre: 0 <= index && index < size 
// post: if pre returns data[index] otherwise returns EMPTY 

    if (0 <= index && index < m_Size){ 

     return m_Data[index]; 
    } 

    else{ 

     return m_EMPTY; 
    } 
} 

int PersonList::get_Size(){ 
// post returns size; 

    return m_Size; 

} 

ответ

5

C++ не поддерживает массивы переменной длины (Vlas), который является то, что вы здесь:

Person m_Data[m_Capacity]; 

Для это для работы, m_Capacity должно быть постоянной времени компиляции.

Кроме того, у вас есть ошибка синтаксиса в конструкторе по умолчанию, где : требуется указать список инициализации:

PersonList::PersonList() : m_Capacity(10), m_Empty(Person()) { .... } 
//      ^Here! 
+0

m_Capacity уже постоянна. – Zasz

+0

@ Zasz Он постоянно для каждого экземпляра 'PersonList', но это не постоянная времени компиляции. – juanchopanza

+0

@juanchopanza Можете ли вы также сказать мне, что такое постоянная времени компиляции, и почему const int в моем коде не является такой константой? – Pietair

0

Конструктор и список инициализации должен быть отделен двоеточием. Нравится

PersonList::PersonList() : m_Capacity(10), m_Empty(Person())